在 64 位的.NET Framework 运行的托管应用程序中的内存不足异常

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 3152158
症状
您必须是托管应用程序面向 64 位 Microsoft.NET Framework 4.6.1。此应用程序将从下列特定消息的 CLR 引发内存不足异常 ︰

OutOfMemoryException:"没有足够内存指定的地址空间范围内继续执行程序。
原因
此内存不足异常传播由 CLR 代码管理器子系统无法为跳转的存根 (stub) 分配特定的地址空间范围内的内存时。(这些跳转的存根 (stub) 对应于调用所在的 Dll 之间 2 GB 或更多与众不同的地址空间中的方法。)必须调用方法来存储为 64 位方法调用跳转存根 (stub) 2 GB 半径内的空间。没有要从此特定错误中恢复的应用程序的安全方法。因此,遇到此错误后该应用程序的状态是未知的它应被视为已损坏。恢复的唯一方法是重新启动应用程序。
替代方法
若要变通解决此问题,请使用以下设置方法之一 ︰
  • 通过添加下面的注册表项和值实现计算机范围设置 ︰

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework

    NGenReserveForjumpStubs= dword:00000005

  • 通过添加实现应用程序级别设置 (或合并) 到您应用程序配置文件的以下部分 ︰
    <configuration>    <runtime> <NGenReserveForJumpStubs value="5" />    </runtime></configuration>
说明︰ NGenReserveForJumpStubs 使 CLR 能够保留每个加载的 NGen 映像附近跳桩模块的地址空间的百分比。我们建议使用值为 5 或更高版本,如果您遇到此发生内存不足异常。
更多信息

对于开发人员来说

  • .NET Framework 将编码方法调用作为相对 32 位跳性能方面的原因。在 64 位系统上,调用方和被调用方可以进行更多相隔超过 2 GB (地址空间) 中。这超出了有符号的 32 位偏移量的地址范围,因为.NET 将创建跳转存根 (stub) 内 2 GB 的调用方。此跳转存根 (stub) 然后,可以将"长时间"跳转到任何地方的 64 位地址空间中。
  • JIT 和 NGen 缓解工作方式略有不同。这两个预留额外的地址空间,但此保留由点不同两者之间。
  • NGenReserveForJumpStubs 是的虚拟 NGen 映像大小 (所占百分比percentReserveForJumpStubs).
  • 一个典型的跳转存根为 12 字节。有关详细信息,请参阅 JUMP_ALLOCATE_SIZE.
  • 分配内存并将其保留接近 NGen 映像被加载位置的地址 (准确的算法是 EEJitManager::EnsureJumpStubReserve).提交的内存量就需要分配一个跳转存根,并没有其他合适的地址空间可用。
  • 前面提到的缓解不修改 NGen 映像的内容。NGen 映像具有相同磁盘空间需求量和无缓解。
  • 目前尚没有好的方法来检测应用程序获取接近限制时。您必须监控 OutOfMemoryException 来确定是否保留的空间是足够的。
  • 即使有很多未使用的内存,因为此特定错误相关的调用方的 2 GB 地址范围半径内的内存的可用性,您可能会收到 OutOfMemoryException。
  • 不应更改默认值 CodeHeapReserveForJumpStubs,因为它可能不与上面描述的问题。我们已经看不到实际的应用程序将不得不调整此设置作为一种解决办法的情况。
  • 将 NGenReserveForJumpStubs 设置为一个更高的值可能会导致性能降低和公开其他微妙问题的风险。

IT 用户

  • 在其他版本的.NET Framework 上也可能出现此问题。但是,解决方法是目前只适用于.NET Framework 4.6.1。
  • 这是极少数的问题,只会影响非常大的工作负载,具有非常特殊的执行模式。99%以上的所有工作负载将以往任何时候都遇到此问题。
  • 应用程序将引发发生内存不足异常后,恢复的唯一推荐的方法是重新启动应用程序。

警告:本文已自动翻译

属性

文章 ID:3152158 - 上次审阅时间:05/10/2016 19:38:00 - 修订版本: 2.0

Microsoft .NET Framework 4.6.1

  • kbsurveynew kbtshoot kbexpertiseinter kbmt KB3152158 KbMtzh
反馈