Delen via


jitCompilationStart MDA

Notitie

Dit artikel is specifiek voor .NET Framework. Dit geldt niet voor nieuwere implementaties van .NET, waaronder .NET 6 en nieuwere versies.

De jitCompilationStart beheerde foutopsporingsassistent (MDA) wordt geactiveerd om te rapporteren wanneer de Just-In-Time-compiler (JIT) een functie begint te compileren.

Symptomen

De grootte van de werkset neemt toe voor een programma dat al een systeemeigen afbeeldingsindeling heeft, omdat mscorjit.dll in het proces wordt geladen.

Oorzaak

Niet alle assembly's van het programma zijn gegenereerd in systeemeigen indeling of een assembly is niet correct geregistreerd.

Oplossing

Als u deze MDA inschakelt, kunt u bepalen welke functie wordt gecompileerd met JIT. Zorg ervoor dat de assembly met de functie wordt gegenereerd voor de systeemeigen indeling en juist is geregistreerd.

Effect op de runtime

Met deze MDA wordt een bericht geregistreerd vlak voordat een methode is gecompileerd, dus het inschakelen van deze MDA heeft aanzienlijke invloed op de prestaties. Als een methode inline is, genereert deze MDA geen afzonderlijk bericht.

Uitvoer

In het volgende codevoorbeeld ziet u voorbeelduitvoer. In dit geval ziet u in de uitvoer dat in assemblytest de methode 'm' in klasse 'ns2.CO' is gecompileerd met JIT.

method name="Test!ns2.C0::m"

Configuratie

In het volgende configuratiebestand ziet u verschillende filters die kunnen worden gebruikt om te filteren welke methoden worden gerapporteerd wanneer ze voor het eerst worden gecompileerd met JIT. U kunt opgeven dat alle methoden worden gerapporteerd door de waarde van het naamkenmerk in te stellen op *.

<mdaConfig>
  <assistants>
    <jitCompilationStart>
      <methods>
        <match name="C0::m" />
        <match name="MyMethod" />
        <match name="C2::*" />
        <match name="ns0::*" />
        <match name="ns1.C0::*" />
        <match name="ns2.C0::m" />
        <match name="ns2.C0+N0::m" />
      </methods>
    </jitCompilationStart >
  </assistants>
</mdaConfig>

Opmerking

Het volgende codevoorbeeld is bedoeld voor gebruik met het voorgaande configuratiebestand.

using System;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

public class Entry
{
    public static void Main(string[] args)
    {
        C0.m();
        C1.MyMethod();
        C2.m();

        ns0.C0.m();
        ns0.C0.N0.m();
        ns0.C1.m();

        ns1.C0.m();
        ns1.C0.N0.m();

        ns2.C0.m();
        ns2.C0.N0.m();
    }
}

public class C0
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void m() { }
}

public class C1
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void MyMethod() { }
}

public class C2
{
    [MethodImpl(MethodImplOptions.NoInlining)]
    public static void m() { }
}

namespace ns0
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }

        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }

    public class C1
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }
    }
}

namespace ns1
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }
        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }
}

namespace ns2
{
    public class C0
    {
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void m() { }

        public class N0
        {
            [MethodImpl(MethodImplOptions.NoInlining)]
            public static void m() { }
        }
    }
}

Zie ook