現在オフラインです。再接続するためにインターネットの接続を待っています

64 ビットの.NET Framework で実行されているマネージ アプリケーションでメモリ不足の例外

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB:3152158
現象
64 ビットの Microsoft の.NET Framework 4.6.1 を対象とするマネージ アプリケーションがあります。このアプリケーションには、次の特定のメッセージを持つ CLR からのメモリ不足の例外がスローされます。

破壊:「メモリ不足」プログラムの実行を続行するのには指定したアドレス スペースの範囲内です。
原因
ジャンプ スタブのコード マネージャーのサブシステムが特定のアドレス スペースの範囲内のメモリを割り当てることができないときに、CLR によってメモリ不足の例外が伝達されます。(スタブをジャンプこれら 2 GB 以上空けてアドレス空間内にある Dll の間で呼び出されるメソッドに対応します)。64 ビットのメソッド呼び出しをジャンプのスタブを格納する呼び出し元のメソッドの 2 GB の半径内にスペースを入力する必要があります。この特定のエラーから回復するのにはアプリケーションの安全な方法はありません。したがって、このエラーが発生した後、アプリケーションの状態は不明ですし、それを考慮する必要がありますが破損しています。回復する唯一の方法では、アプリケーションを再起動します。
回避策
この問題を回避するには、以下の設定方法の 1 つを使用します。
  • 次のレジストリ キーと値を追加することによって、コンピューター レベルの設定を実装します。

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • 追加することにより、アプリケーション レベルの設定を実装する (またはマージ)、アプリケーション構成ファイルに次のセクション。
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
説明: NGenReserveForJumpStubs すると、CLR が読み込まれた各 NGen イメージの近くのジャンプのスタブのアドレス領域の割合を予約します。この OutOfMemory 例外が発生した場合は、5 以上の値を使用することをお勧めします。
詳細

開発者向け

  • .NET Framework メソッドをエンコードするパフォーマンス上の理由から相対的な 32 ビットのジャンプと呼び出し。64 ビット システムでは、呼び出し元と呼び出し先が離れることになるさらに (アドレス空間) で 2 GB を超える。これは、符号付き 32 ビット オフセットのアドレスの範囲を超えているために、.NET は呼び出し元の 2 GB 以内のジャンプのスタブを作成します。このジャンプ スタブことができますし、「長い」にジャンプする任意の場所で 64 ビット アドレス空間を作成します。
  • JIT、NGen の緩和策は、少し異なる方法で動作します。余分なアドレス空間を前もっての予約それらの両方が、この予約が行われる場所が異なる 2 つの。
  • NGenReserveForJumpStubs は、仮想の NGen イメージのサイズ (の割合percentReserveForJumpStubs).
  • ジャンプの典型的なスタブは、12 バイトです。詳細については、 JUMP_ALLOCATE_SIZE.
  • メモリが割り当てられ、NGen イメージが読み込まれたアドレスに予約されている (正確なアルゴリズムは、 EEJitManager::EnsureJumpStubReserve).ジャンプ スタブを割り当てる必要がある場合、および利用可能なその他の適切なアドレス空間がない場合は、メモリを努めています。
  • 前述の軽減には、NGen イメージの内容を変更しません。NGen イメージには、リスク軽減の有無にかかわらず、同じディスク容量があります。
  • 現在のアプリケーションは、制限に近づいたときを検出するために良い方法はありません。予約済み領域が十分かどうかを確認するが破壊を監視する必要があります。
  • 大量のメモリが使用されていないために、この特定のエラーは、呼び出し元の 2 GB のアドレス範囲の半径内にあるメモリの可用性に関連する場合でもが破壊が表示される可能性があります。
  • 上記の問題に関連しない可能性がありますので、CodeHeapReserveForJumpStubs の既定値を変更する必要はありません。ケースの実際のアプリケーションが問題を回避するには、この設定を調整する必要があるられなかった。
  • NGenReserveForJumpStubs の非常に高い値に設定は、パフォーマンスが低下しその他の微妙な問題を公開することのリスクを軽減する可能性があります。

IT ユーザーのため

  • 他のバージョンの.NET Framework では、この問題は発生可能性がありますも。ただし、回避策は、現在、.NET Framework 4.6.1 にのみ適用できます。
  • これは、非常にまれな問題を非常に特定の実行パターンを持つ非常に大きな作業負荷に影響を与えるだけです。すべての作業負荷の 99% 以上では、この問題が発生がします。
  • OutOfMemory 例外をスローするアプリケーションに後を回復する唯一の推奨される方法は、アプリケーションを再起動します。

警告: この記事は自動翻訳されています

プロパティ

文書番号:3152158 - 最終更新日: 05/10/2016 16:51:00 - リビジョン: 3.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtja
フィードバック