如何预测内存溢出?

7
在我的C#程序中,我进行了各种消耗内存的操作。根据当前可用内存量和各种不确定因素,程序在不同阶段会发生OutOfMemoryException异常。
当很明显程序将在不久的将来遇到OOM时,我想在某个时刻停止处理。
然而,这没有固定的门槛;其他用户可能有更多(或更少)的内存,另一个操作系统具有其特定的内存限制等等。
我不想仅仅检查软件是否消耗了超过500MB的内存,因为这可能是太高或太低的限制。
在.NET中,有可靠的方法来预测即将发生的OOM吗?

1
我会建议你在进行操作前跟踪内存泄漏。 - Steve B
听起来你有一个问题,这个问题应该被解决,而不是逃避它。 - H H
提议的重复内容标题非常相似,但主题却有很大不同。 - H H
1
这不是内存泄漏,当对多个图像进行一些图像密集型操作时,这是正常的。 - Alex
3个回答

6

2
简短的答案是这可能不是最好的解决方案。与其预测何时会耗尽内存并试图解决它,您应该尝试减少应用程序的内存消耗,或者等待 OutOfMemoryException 异常被抛出,然后清理。
当 .Net 运行时无法分配刚请求的内存时,就会抛出 out of memory 异常。这可能是因为计算机已经用完了物理内存并禁用了交换文件(或计算机已经用完了磁盘空间),也可能是因为进程的虚拟内存空间过于碎片化,无法分配所需的内存块(在处理大对象时可能会发生)。预测什么时候会出现这种情况是相当困难的。
您可以使用 MemoryFailPoint类来检查在开始使用大量内存的操作之前是否会有一定数量的内存可用,但是该类不能保证在操作期间内存仍将可用,因此您的应用程序可能仍然会出现OOM异常。虽然在某些情况下,这个类可能对尝试减少OOM异常(进而避免破坏应用程序状态)很有用,但它可能不会成为解决问题的“万能药”。

减少内存消耗是一个显而易见的建议,但不幸的是,考虑到正在解决的任务,这相当困难。感谢MemoryFailPoint的建议。 - Alex

0

我观察到的许多OOM异常都是由于编写不当的应用程序或存在内存泄漏或第三方组件引起的。考虑使用针对您操作进行优化的数据结构。

检测OOM异常非常困难,因为它们是随机抛出的。也许您可以使用MemoryFailPoint和性能计数器(可用内存)来确保有足够的可用内存。


1
减少内存消耗是一个显而易见的建议,但不幸的是,考虑到正在解决的任务,这相当困难。感谢MemoryFailPoint的建议。 - Alex

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