2011-03-24 83 views
1

我正在群集上运行我的代码,并且看到一个问题,我无法在本地复制,并且看不到原因。OutOfMemoryException/ERROR_COMMITMENT_LIMIT在系统中有很多空闲内存

因此,程序开始虚假地抛出OutOfMemoryException在整个代码中随机的地方。此外,看起来这可能与Windows本身已经损坏的东西有关 - 其​​中一个异常表现为Assembly.Load操作的HRESULT,HRESULT为0x800705AF,解码时表示错误1455 ERROR_COMMITMENT_LIMIT(交换文件已耗尽)

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

我该如何调试这个错误的原因呢?使用哪些诊断工具?

+0

你的交换文件是固定大小还是自动的? – Erik 2011-03-24 13:04:19

+0

如果你是32位的,你只有2(有时是3)GB的进程地址空间。无论服务器有多少实际内存 - 如果您分配了2GB的地址空间,则实际上内存不足。 – 2011-03-24 13:58:43

+0

@Damien - 我知道 - 但程序实际上消耗低于一百兆字节。 – jkff 2011-03-24 14:54:21

回答

2

This is 64位进程死于内存不足的情况。小心你的看法来诊断这一点。它是从来没有你用尽的内存,它是虚拟内存空间。您必须查看像VM大小或专用字节这样的数字,任务管理器过于关注RAM。

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

使用像SysInternals的Process Explorer这样的工具来再次看看。内存分析器,当你看到虚拟内存大小增长没有界限。

0

首先检查您的应用程序是否在32位或64位模式下运行,如果您的应用程序具有* 32,则表明它在32位以下运行,请查看taskmanager。 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