C#-以编程方式尝试检查代码块中内存泄漏的方法

本文关键字:内存 泄漏 方法 代码 编程 方式尝 检查 C#- | 更新日期: 2023-09-27 17:58:44

我正在尝试以编程方式准确确定托管.NET代码块中存在潜在内存泄漏的可行性。这样做的原因是隔离一些看起来正在泄漏内存的代码块,然后使用标准探查器来进一步确定泄漏的实际原因。在我的特定业务案例中,我将加载一个第三方类,该类扩展了我的一个类,以检查它是否泄漏。

首先想到的方法是这样的:

  • 等待GC运行
  • 从GC获取当前分配的内存
  • [运行托管代码块。]
  • 等待GC运行
  • 从GC中获取当前分配的内存,并从运行代码块之前记录的分配内存中减去。如果在运行的代码块中分配的所有对象都被适当地取消引用并收集,那么理论上差异应该(接近)0,这正确吗

当然,眼前的问题是,很可能会有人在等待。。。和等待。。。以及等待非确定性GC运行。如果我们跳过这一方面,那么确定代码块是否泄露了任何内存的计算可能会有很大的变化,而且不一定是准确的,因为当时可能还没有收集到一些项目。

以上似乎是我尝试在一定程度上准确确定代码块是否正在泄漏内存的最佳选择吗?或者现实生活中还有其他工作方法吗?谢谢

C#-以编程方式尝试检查代码块中内存泄漏的方法

就我个人而言,我永远不敢独自进行内存分析。我会担心我要么没有完全的知识,要么需要无尽的时间才能做到

相反,我成功地使用了内存评测器,比如红门的ANTS内存评测器。

虽然使用ANTS Profiler非常棒,但如果您的问题只出现在生产中,它也无济于事。

Tess Ferrandez有一系列的实验室来演示如何调试生产问题,包括内存泄漏。他们专注于ASP.NET,但它也可以用于其他类型的应用程序。

您确实需要像这样的内存档案器:有了它,您可以:

  • 启动应用程序,获取内存快照(手动或从代码中)
  • [运行托管代码块]
  • 获取另一个内存快照
  • 比较这两个快照,看看托管堆上现在有哪些新对象

我相信它正是你想做的,只是远没有那么痛苦。它还有一些有用的过滤器,如"显示代理保持活动状态的对象"。它还可以分析生产系统中的内存转储。