.net - .NET 中 OutOfMemoryException 的 try/catch block 的设计模式

标签 .net try-catch idisposable out-of-memory

我有一个处理大量数据的应用程序,我想,有时可能是 OutOfMemoryException将被抛出(半年以来,我没有任何异常,但我只是想了解所有相关信息)。正如我所调查的,在此异常之后,我无法继续执行我的程序。

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

最佳答案

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

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

  • 使用流数据 API 而不是缓冲内存中的所有内容
  • 重用缓冲区等
  • 避免巨大的数组/列表/等(事实上,最有可能导致 OOM 的方法是请求一个巨大的(但单一的)数组)——例如,锯齿状数组比二维数组更好地扩展(即使在 x64 上也有单个数组最大大小的硬限制)
  • 想想你如何处理稀疏数据
  • 您是否从外部资源中读取了大量字符串?如果是这样,请考虑使用自定义内部人员,这样您就不会拥有 20,000 个不同的常见字符串副本(例如国家/地区名称)
  • 密切关注您发布的内容
  • 避免意外延长对象的生命周期,尤其是通过事件订阅(因意外延长生命周期而臭名昭著)
  • 关于.net - .NET 中 OutOfMemoryException 的 try/catch block 的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6635354/

    相关文章:

    c# - 何时开始使用 IL 而不是高级语言

    .net - 数据源配置向导中没有实体数据模型选项

    java - 如何切换 if 和 else 语句来尝试和捕获

    c# - 处理对象的代码分析友好方式

    c# - 使用 GC.Collect() 是正确的; GC.WaitForPendingFinalizers();?

    Java 捕获哪个断言错误

    c# - 在哪里捕获异步代码中的异常?

    c# - Service owns disposable Repository that owns disposable DbContext - Dispose IDisposables injected with Unity

    c# - 为什么类会显式而不是隐式实现 IDisposable?

    c# - 从集合中通用创建逗号分隔的字符串列表