特定のシナリオでは、バックグラウンド JIT コンパイルが機能しない場合があります。PerfView http://www.microsoft.com/en-us/download/details.aspx?id=28567を使用してデバッグできます。
ドキュメントから、主な理由は次のとおりです。
モジュールがロードされると、モジュールコンストラクターが呼び出される可能性があり、これには副作用が生じる可能性があります (これは非常にまれです)。したがって、バックグラウンド JITTing によってモジュールが他の方法よりも早くロードされると、(まれな) バグが露呈する可能性があります。バックグラウンド JIT には非常に高い互換性バーがあったため、JIT コンパイル時にロードされた EXACT モジュールを各メソッドにタグ付けすることでこれを防ぎ、すべての EXACT モジュールもロードされた後にのみバックグラウンド JIT コンパイルを許可します。現在の実行。したがって、(以前のユーザー アクションによって異なるモジュールがロードされたため) ロードされるモジュールの数が増減するシナリオ (メニューを開くなど) がある場合、バックグラウンド JIT がうまく機能しない可能性があります。
System.Assembly.ModuleResolve イベントにコールバックをアタッチした場合、ModuleResolve コールバックが 2 回目の実行で異なる応答を返した場合、バックグラウンド JITing に副作用が生じる可能性があります (非常にまれであり、非常に悪い設計ですが)。ファーストラン。このバックグラウンドにより、JIT コンパイルは、ModuleResolve コールバックが初めて呼び出されたときに中断されます。
失敗したモジュール ルックアップは、最終的に失敗する前に ModuleResolve イベントを呼び出すため、失敗したモジュールのプローブはバックグラウンド JIT コンパイルも禁止することを意味します。
バックグラウンド JIT に失敗しているアセンブリがこれらの問題のいずれかを公開しているかどうかを確認することをお勧めします。これを行うには、アプリケーションを開始する前に新しいコレクションを開始し、完了したら停止します。Advanced セクションのBackground JITオプションをチェックすることを忘れないでください。
JITStats セクションでは、次のようになります。
Total Number of JIT compiled methods : 10,673
Total MSec JIT compiling : 9,873
This process uses Background JIT compilation (System.Runtime.ProfileOptimize)
WARNING: Background JIT aborted at 11,847.909 Msec
The last assembly before the abort was 'NHibernate.XmlSerializers' loaded unsuccessfully at 11,793.741
Methods Background JITTed : 0
Percent # Methods Background JITTed : 0.0%
アップデート
シナリオ 3 に関連して、ASP.NET の場合、ASP.NET 自体が ModuleResolve イベントを処理するため、モジュールの読み込みに失敗すると、ASP.NET アプリで MCJ が中止されます。