从 .NET 的角度来看:
我见过的最好的解释是免费的Foundations of Programming 电子书的第 7 章。
基本上,在 .NET 中,当引用的对象被植根时会发生内存泄漏,因此无法进行垃圾回收。当您保留超出预期范围的引用时,会意外发生这种情况。
当您开始收到 OutOfMemoryExceptions 或您的内存使用量超出您的预期( PerfMon 有很好的内存计数器)时,您就会知道您有泄漏。
了解 .NET 的内存模型是避免它的最佳方式。具体来说,了解垃圾收集器的工作原理以及引用的工作原理——再次,我建议您参阅电子书的第 7 章。此外,请注意常见的陷阱,可能是最常见的事件。如果对象 A 注册到对象 B 上的事件,则对象 A 将一直存在,直到对象 B 消失,因为 B 持有对 A 的引用。解决方案是在您完成后取消注册您的活动。
当然,一个好的内存配置文件可以让您查看对象图并探索对象的嵌套/引用,以查看引用来自何处以及负责哪个根对象(红门蚂蚁配置文件,JetBrains dotMemory,memprofiler真的很好选择,或者您可以使用纯文本 WinDbg 和 SOS ,但我强烈推荐商业/视觉产品,除非您是真正的大师)。
我相信非托管代码会受到其典型的内存泄漏的影响,除了共享引用由垃圾收集器管理。最后一点我可能是错的。