.net a";“内存泄漏”;

.net a";“内存泄漏”;,.net,performance,memory-leaks,com-interop,.net,Performance,Memory Leaks,Com Interop,在.NET透视图中: 什么是a 如何确定应用程序是否泄漏?有什么影响 如何防止内存泄漏 如果您的应用程序存在内存泄漏,当进程退出或被终止时,它会消失吗?或者,即使在进程完成后,应用程序中的内存泄漏是否会影响系统上的其他进程 那么通过COM互操作和/或P/Invoke访问的非托管代码呢 我猜在托管环境中,泄漏是指您保留对大量内存的不必要引用。我同意Bernard的看法,在.net中,什么是内存泄漏 您可以分析应用程序以查看其内存使用情况,并确定如果应用程序在不应该管理大量内存的情况下管理大量内存

在.NET透视图中:

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

我猜在托管环境中,泄漏是指您保留对大量内存的不必要引用。

我同意Bernard的看法,在.net中,什么是内存泄漏

您可以分析应用程序以查看其内存使用情况,并确定如果应用程序在不应该管理大量内存的情况下管理大量内存,则可以说它存在泄漏

在管理方面,我会冒着风险说,一旦进程被终止/删除,它确实会消失


非托管代码是它自己的野兽,如果其中存在泄漏,它将遵循标准mem。泄漏定义。

我所看到的最好的解释是在免费的第7章

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

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

理解.NET的记忆模型是避免它的最好方法。具体地说,了解垃圾收集器的工作原理和引用的工作原理——同样,我建议您阅读电子书的第7章。此外,要注意常见的陷阱,最常见的可能是事件。如果对象A注册到对象B上的事件中,则对象A将一直保留,直到对象B消失,因为B包含对A的引用。解决方案是在完成后注销事件

当然,良好的内存配置文件可以让您查看对象图,并探索对象的嵌套/引用,以查看引用来自何处以及根对象负责什么(,JetBrains dotMemory,是非常好的选择,或者您可以只使用文本WinDbgSOS,但我强烈推荐商业/视觉产品,除非您是真正的大师)


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

严格来说,内存泄漏会消耗程序“不再使用”的内存

“不再使用”有不止一个含义,它可能意味着“不再提及它”,也就是说,完全不可恢复,也可能意味着引用、可恢复、未使用,但程序仍保留引用。只有后者适用于.Net for完美管理的对象。然而,并非所有类都是完美的,在某个点上,底层非托管实现可能永久泄漏该过程的资源党卫军

在所有情况下,应用程序消耗的内存都超过了严格要求。根据泄漏的数量,副作用可能从无到过度收集导致的速度减慢,再到一系列内存异常,最后是致命错误,最后是强制进程终止

当监控显示在每个垃圾收集周期后越来越多的内存分配给进程时,您就知道应用程序存在内存问题。在这种情况下,您要么在内存中保留了太多内存,要么某个底层非托管实现正在泄漏


对于大多数泄漏,在进程终止时会恢复资源,但是在某些特定情况下,某些资源并不总是会恢复,GDI游标句柄因此而臭名昭著。当然,如果您有进程间通信机制,则在另一个进程释放或终止之前,不会释放在该进程中分配的内存是。

我将内存泄漏定义为在完成后未释放所有分配内存的对象。我发现,如果您使用Windows API和COM,则应用程序中可能会发生这种情况(即,非托管代码中存在错误或未正确管理),在框架和第三方组件中。我还发现,使用某些对象(如笔)后不整理会导致问题

我个人曾遇到过内存不足异常,这些异常可能是由dot-net应用程序中的内存泄漏引起的,但并不是唯一的。(OOM也可能来自pinning see)。如果您没有收到OOM错误,或者需要确认是否是内存泄漏引起的,那么唯一的方法就是分析您的应用程序

我还将努力确保以下几点:

a) 实现Idisposable的所有内容都可以使用finally块或using语句进行处理,这些语句包括画笔、钢笔等(有些人主张将所有内容都设置为nothing)

b) 使用finally或using语句再次关闭任何具有close方法的对象(尽管我发现using并不总是关闭,这取决于您是否在using语句之外声明了对象)

c) 如果您使用的是非托管代码/windows API,则这些代码将在之后正确处理。(有些具有释放资源的清理方法)


希望这有帮助。

所有内存泄漏都可以通过程序终止来解决

泄漏足够的内存,操作系统可能会决定代表您解决问题


我想在一个有管理的环境中 你会不会留个口信 对大数据块的不必要引用 周围的记忆

当然。另外,不要使用.Dis
StreamReader sr;
using(sr = new StreamReader("somefile.txt"))
{
    //do some stuff
}
SomeExternalClass.Changed += new EventHandler(HandleIt);
.loadby sos mscorwks
!dumpheap -stat -type <TypeName>