7

在我的 C# 程序中,我执行各种消耗内存的操作。根据当前可用的内存量和各种非常量情况,程序在不同阶段失败并出现 OutOfMemoryException。

当程序在不久的将来或多或少明显会因OOM而失败时,我想在某个时候停止处理。

但是,对此没有固定的阈值;其他用户可能拥有更多(或更少)内存,另一个操作系统具有其内存细节等等。

我不想只检查软件消耗的空间是否超过 500MB,因为这可能是一个太高或太低的限制。

有没有可靠的方法来预测 .NET 中即将出现的 OOM?

4

3 回答 3

6

MemoryFailPoint 应该做你想做的事。

http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx

于 2012-09-11T09:30:01.837 回答
2

排序的答案是它可能不是最好的解决方案 - 与其预测何时会耗尽内存并尝试对其进行处理,您可能应该尝试减少应用程序的内存消耗,或者只是等到抛出 OutOfMemoryException异常然后清理。

每当 .Net 运行时无法分配刚刚请求的内存时,就会引发内存不足异常 - 这可能是因为机器的物理内存不足并且交换文件被禁用(或者机器的磁盘空间不足) ),或者可能是因为进程的虚拟内存空间过于碎片化而无法分配所需的内存块(在处理大型对象时可能会发生这种情况)。预测什么时候会是相当困难的。

您可以使用MemoryFailPoint类检查在开始使用大量内存的操作之前是否有一定数量的内存可用,但是该类不保证内存在持续时间内保持可用操作,因此您的应用程序仍然可能因 OOM 异常而失败。尽管此类在某些情况下可以用于尝试减少 OOM 异常(进而避免破坏应用程序状态),但它可能不会成为解决问题的“灵丹妙药”。

于 2012-09-11T09:43:03.450 回答
0

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

检测OOM是相当困难的,因为有随机抛出。也许您可以使用 MemoryFailPoint 和 Performance 计数器(可用内存)来确保有足够的可用内存。

于 2012-09-11T09:37:57.150 回答