在 64 位元的.NET Framework 執行的 managed 應用程式中的記憶體不足例外狀況

請注意--重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,且可能由 Microsoft Community 利用 Community Translation Framework技術或人工進行事後編修。翻譯過程並無專業譯者參與。Microsoft 同時提供使用者人為翻譯、機器翻譯及社群編修後的機器翻譯三種版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,所有翻譯文章都可能不盡完美,內容都可能出現詞彙、語意或文法上的錯誤。就翻譯內容之不正確或錯誤,或客戶因使用翻譯內容所產生的任何損害,微軟不負擔任何責任。Microsoft將依合理的商業努力不斷地更新機器翻譯軟體和工具,以期能為使用者提供更好的服務。

按一下這裡查看此文章的英文版本:3152158
徵狀
您有受管理的應用程式的目標的 64 位元的 Microsoft.NET Framework 4.6.1。這個應用程式中,會擲回記憶體不足例外狀況從 CLR,並出現下列的特定訊息 ︰

OutOfMemoryException: 「 記憶體不足,無法繼續程式執行指定的位址空間範圍內。"
發生的原因
當程式碼管理員子系統無法配置跳躍 stub 的需求的特定位址空間範圍內的記憶體時,clr 會傳用這個記憶體不足例外狀況。(這些跳 stub 對應 2 GB 或以上分開的位址空間中,位於 Dll 之間呼叫的方法。)必須要有 2 GB 半徑內的呼叫的方法來儲存跳躍虛設常式,以 64 位元的方法呼叫的空間。沒有從這個特定的錯誤復原應用程式的安全方法。因此,它遇到此錯誤之後,應用程式的狀態不明,應將它視為損毀。若要復原的唯一方法是重新啟動應用程式。
其他可行方案
若要解決這個問題,請使用下列的設定方法的其中一個 ︰
  • 新增下列登錄機碼和值,以實作全機器設定 ︰

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • 藉由加入實作應用程式層級設定 (或合併) 到您的應用程式組態檔的下一節 ︰
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
說明︰ NGenReserveForJumpStubs 造成 CLR 保留跳躍 stub,每個載入的 NGen 影像附近的位址空間的百分比。我們建議您使用的是大於或等於 5 的值,如果您遇到這個 OutOfMemory 例外狀況。
其他相關資訊

開發人員

  • .NET Framework 編碼方法呼叫視作相對的 32 位元跳轉,基於效能考量。在 64 位元系統上,呼叫端和被呼叫端可以進一步切割比 2 GB (在 [位址空間)。因為超過正負號的 32 位元位移的位址範圍,.NET 就會建立跳躍虛設常式內的呼叫端的 2 GB。此跳轉虛設常式可以然後產生 「 long 」 跳到任何地方的 64 位元位址空間中。
  • JIT 和 NGen 的緩和措施的運作方式稍有不同。這兩者保留額外的位址空間最前面的位置,但是兩者之間的保留區其中所有的元件由點不同。
  • NGenReserveForJumpStubs 是虛擬的 NGen 影像大小 (百分比percentReserveForJumpStubs).
  • 典型的跳躍虛設常式是 12 個位元組。如需詳細資訊,請參閱 JUMP_ALLOCATE_SIZE.
  • 記憶體配置及保留接近 NGen 影像載入的位置的位址 (一定的演算法是 EEJitManager::EnsureJumpStubReserve).當需要配置跳躍 stub,而且沒有其他適用的地址空間,就會認可的記憶體。
  • 先前所述的緩和措施不會修改 NGen 影像的內容。NGen 影像會有相同的磁碟使用量及未降低。
  • 正在偵測應用程式取得接近上限時沒有什麼好方法。您必須監視 OutOfMemoryException,以判斷保留的空間是否足夠。
  • 您可能會收到 OutOfMemoryException,即使有許多未使用的記憶體因為這個特定的錯誤與呼叫端的 2 GB 位址範圍半徑內的記憶體的可用性。
  • 您不應該變更預設值的 CodeHeapReserveForJumpStubs,因為它可能與上述的問題。我們尚未看到實際的應用程式會需要調整此設定,因應措施的情況。
  • 將 NGenReserveForJumpStubs 設定為明顯較高的值可能會導致效能降低和公開其他微妙的問題的風險。

IT 使用者

  • 在.NET Framework 的其他版本,也可能會發生這個問題。不過,因應措施是目前只適用於.NET Framework 4.6.1。
  • 這是非常少見的問題,只會影響很大的工作負載,具有非常特別的執行模式。超過 99%的所有工作負載會曾經遇到這個問題。
  • 應用程式會擲回的例外狀況 OutOfMemory 之後,唯一的建議的方法,以復原,就是重新啟動應用程式。

警告:本文為自動翻譯

內容

文章識別碼:3152158 - 最後檢閱時間:05/10/2016 20:24:00 - 修訂: 2.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtzh
意見反應