OutOfMemoryException / ERROR_COMMITMENT_LIMIT,系统中有大量可用内存

时间:2011-03-24 12:58:04

标签: .net windows out-of-memory swap

我正在群集上运行我的代码而且我看到一个我无法在本地复制的问题,并且没有看到原因。

因此,该程序开始在整个代码的随机位置虚假抛出OutOfMemoryException。

此外,看起来这可能与Windows本身已经破坏的东西有关 - 其​​中一个异常表现为Assembly.Load操作的HRESULT,HRESULT为0x800705AF,当解码时,意味着错误1455 ERROR_COMMITMENT_LIMIT(交换文件已耗尽)

该程序实际上消耗的内存非常少,它是32位,在.NET 4.0.30319下运行,服务器是Windows Server 2008,有12个内核,24Gb RAM(几乎所有内存都是免费的)和交换分区上有几十GB的可用硬盘空间。

如何调试此错误的原因?使用什么诊断工具?

2 个答案:

答案 0 :(得分:2)

64位进程在内存不足情况下死机的方式。小心你所看到的以诊断它。它耗尽的永远 RAM,它是虚拟内存空间。您必须查看VM大小或专用字节数,任务管理器过于关注RAM。

64位进程具有巨大的虚拟内存空间,16 GB及以上,具体取决于您运行的Windows版本。它是不可能完全使用它,机器死亡交换死亡之前,你可以接近。当然操作系统当然不允许发生,因此ERROR_COMMITMENT_LIMIT。实际上,64位进程受页面文件中可以保留的空间量的限制。

使用像SysInternals的Process Explorer这样的工具再看看。当您看到虚拟内存大小不受限制地增长时的内存分析器。

答案 1 :(得分:0)

首先检查您的应用程序是在32位还是64位模式下运行,如果您的应用程序最终具有* 32,那么请查看taskmanager,这意味着它在32位下运行。 32位应用程序只有2GB的虚拟地址空间供您的应用程序使用。当操作系统找不到足够的连续地址来满足您的应用程序内存请求时,就会发生OOM。因此,为了确定问题,我建议您阅读文章http://www.codeproject.com/Articles/176031/Out-of-Memory-Exception-A-simple-string-Split-can-.aspx。如果上述文章无法解决您的问题,那么您可以参考http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructions.aspx