在我的C#程序中,我执行各种耗费内存的操作。根据当前可用的内存量和各种非常量情况,程序在不同阶段的OutOfMemoryException失败。
我希望在某个时候停止处理,因为在不久的将来,程序会因OOM而失败。
但是,没有固定的门槛;其他用户可能拥有更多(或更少)内存,另一个具有内存特定功能的操作系统等等。
我不想只检查软件消耗超过500MB,因为限制可能太高或太低。
有没有可靠的方法来预测即将推出的.NET中的OOM?
答案 0 :(得分:6)
MemoryFailPoint应该做你想做的事。
http://msdn.microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx
答案 1 :(得分:2)
排序的答案是,它可能不是最好的解决方案 - 而不是预测当你要耗尽内存并试图对它做些什么时,你应该尝试减少你的应用程序的内存消耗或者只是等到抛出OutOfMemoryException 异常然后清理。
只要.Net运行时无法分配刚刚请求的内存,就会引发内存不足异常 - 这可能是因为机器已用尽物理内存并且交换文件已禁用(或者机器已用完)磁盘空间),或者可能是因为进程的虚拟内存空间过于分散而无法分配所需的内存块(在处理大型对象时可能会发生这种情况)。预测何时会发生这种情况是相当困难的。
在开始耗尽大量内存的操作之前,您可以使用MemoryFailPoint类来检查是否有一定数量的内存可用,但此类不保证内存在操作期间仍然可用,因此无论如何您的应用程序仍可能因OOM异常而失败。虽然这个类在某些情况下可以用来尝试减少OOM异常(反过来避免破坏应用程序状态),但它可能不会成为解决问题的“神奇子弹”。
答案 2 :(得分:0)
到目前为止,我观察到的许多OOM异常都是由于内存泄漏或第三方组件的不正确书面应用程序引起的。请考虑为您的操作使用数据结构优化。
检测OOM非常困难,因为随机抛出。也许你可以使用MemoryFailPoint和Performance计数器(可用内存)来确保有足够的可用内存。