jitCompilationStart MDA

Note

この記事は .NET Framework に固有のものです。 .NET 6 以降のバージョンを含む、.NET の新しい実装には適用されません。

just-in-time (JIT) コンパイラが関数のコンパイルを開始すると、 jitCompilationStart マネージド デバッグ アシスタント (MDA) がアクティブ化されて報告されます。

Symptoms

mscorjit.dll がプロセスに読み込まれるため、既にネイティブ イメージ形式のプログラムではワーキング セットのサイズが大きくなります。

原因

プログラムが依存するすべてのアセンブリがネイティブ形式で生成されていないか、アセンブリが正しく登録されていません。

Resolution

この MDA を有効にすると、JIT コンパイルされている関数を識別できます。 関数を含むアセンブリがネイティブ形式で生成され、適切に登録されていることを確認します。

ランタイムへの影響

この MDA は、メソッドが JIT コンパイルされる直前にメッセージをログに記録するため、この MDA を有効にするとパフォーマンスに大きな影響があります。 メソッドがインラインの場合、この MDA は別のメッセージを生成しません。

アウトプット

次のコード サンプルは、出力例を示しています。 この場合、出力は、アセンブリ テストで、クラス "ns2.CO" のメソッド "m" が JIT コンパイルされたことを示しています。

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

コンフィギュレーション

次の構成ファイルは、最初の JIT コンパイル時に報告されるメソッドをフィルターで除外するために使用できるさまざまなフィルターを示しています。 name 属性の値を *に設定することで、すべてのメソッドを報告するように指定できます。

<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>

Example

次のコード サンプルは、上記の構成ファイルで使用することを目的としています。

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() { }
        }
    }
}

こちらも参照ください