当我达到1GB时出现了OutOfMemoryException。

3

有人知道为什么当TaskMgr.exe显示我的进程只占用约1GB内存时,我会收到OutOfMemoryException异常吗?


你在哪里得到了异常? - SLaks
4个回答

5

2
如果您想要比任务管理器更好的工具,可以从微软下载SysInternals套件,并使用Process Explorer实用程序在应用程序运行时监视它。选择View->Select Columns->Process Memory并设置您想要监视的列。这将更好地显示内存中正在发生的情况。
话虽如此,我的猜测是堆中可用连续内存不足是问题所在。

1

如果您没有定义交换空间,则增加虚拟内存大小可能会有所帮助。

此外,请注意,当您使用.NET时,32位.NET代码的进程内存限制往往比理论限制低得多。在内存使用量达到1.2GB和1.6GB之间时,很常见出现内存不足错误 - 远低于理论上的2GB限制。(即使分配小块内存,这也是正确的。)

转移到64位平台很可能会消除此问题。(您的1GB可能并不完全准确,TaskMgr估计内存分配的能力非常差。)


如果您正在分配小对象,但仍然足够大以位于 LOH 上,则在较低阈值下发生的可能性实际上更大。特别是当对象的生命周期可以显着变化时。 GC 中的碎片可能会引起许多问题。 - GrayWizardx
我认为任何足够大到被分配在大对象堆上的对象都不是一个小对象;) 但是,任何LOH分配都会导致系统碎片化,而且你拥有的越多,情况就越糟。即使是在LOH大小阈值以下的小对象,也可能会发生这种情况。 - Reed Copsey

0

是不是IDE限制了你可以使用的内存量?如果是这样,你可以提供运行参数来扩展可用内存的数量。至少在eclipse中是这样的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接