小编典典

“内存泄漏”的剖析

all

从 .NET 的角度来看:

  • 什么是内存泄漏
  • 如何确定您的应用程序是否泄漏?有什么影响?
  • 如何防止内存泄漏?
  • 如果您的应用程序有内存泄漏,它会在进程退出或被杀死时消失吗?或者,即使在进程完成后,您的应用程序中的内存泄漏是否会影响系统上的其他进程?
  • 那么通过 COM Interop 和/或 P/Invoke 访问的非托管代码呢?

阅读 220

收藏
2022-08-16

共1个答案

小编典典

我见过的最好的解释是免费的Foundations of Programming
电子书的
第 7 章。

基本上,在 .NET 中,当引用的对象被植根时会发生内存泄漏,因此无法进行垃圾回收。当您保留超出预期范围的引用时,会意外发生这种情况。

当您开始收到 OutOfMemoryExceptions 或您的内存使用量超出您的预期( PerfMon
有很好的内存计数器)时,您就会知道您有泄漏。

了解 .NET 的内存模型是避免它的最佳方式。具体来说,了解垃圾收集器的工作原理以及引用的工作原理——再次,我建议您参阅电子书的第 7
章。此外,请注意常见的陷阱,可能是最常见的事件。如果对象 A 注册到对象 B 上的事件,则对象 A 将一直存在,直到对象 B
消失,因为 B 持有对 A 的引用。解决方案是在您完成后取消注册您的活动。

当然,一个好的内存配置文件可以让您查看对象图并探索对象的嵌套/引用,以查看引用来自何处以及负责哪个根对象(红门蚂蚁配置文件,JetBrains
dotMemory,memprofiler真的很好选择,或者您可以使用纯文本 WinDbg
SOS ,但我强烈推荐商业/视觉产品,除非您是真正的大师)。

我相信非托管代码会受到其典型的内存泄漏的影响,除了共享引用由垃圾收集器管理。最后一点我可能是错的。

2022-08-16