.NET中OutOfMemoryException的try/catch块的设计模式

VMA*_*Atm 5 .net idisposable try-catch out-of-memory

我有一个适用于大量数据的应用程序,我想,可能是,有时候OutOfMemoryException会被抛出(半年来,我没有一个例外,但我只是想知道所有这些).正如我所调查的那样,在此异常之后,我无法继续执行我的程序.

是否有任何好的模式来处理这些异常,尤其是使用IDisposable类?

Mar*_*ell 5

在真正的 OOM 场景中(在 x86 上比在 x64 上更有可能)你注定要失败。几乎任何事情都会导致分配,所以你最好的选择是尽可能快地优雅地死去,把伤害降到最低。

既然它没有发生,不要过分强调,但避免比处理更好:

  • 使用流数据 API 而不是缓冲内存中的所有内容
  • 重用缓冲区等
  • 避免巨大的数组/列表/等(事实上,最有可能导致 OOM 的方法是请求一个巨大的(但单一的)数组)——例如,锯齿状数组比二维数组更好地扩展(即使在 x64 上也有单个数组最大大小的硬限制)
  • 考虑如何处理稀疏数据
  • 您是否从外部资源中读取了大量字符串?如果是这样,请考虑使用自定义内部人员,这样您就不会拥有 20,000 个不同的常见字符串副本(例如,国家/地区名称)
  • 留意你什么时候发布的
  • 避免意外延长对象的生命周期,尤其是通过事件订阅(因意外延长生命周期而臭名昭著)