如何找到内存泄漏在.NET应用程序的原因
发布网友
发布时间:2022-05-24 07:34
我来回答
共1个回答
热心网友
时间:2023-10-08 21:02
.net应用程序内存原理是由GC进行分代控制的。新生代(0代),年轻代(1)与老年代(2)会在GC不同的时间进行回收,所以基本上不用考虑内存泄露的问题。
但GC回收毕竟通过系统回收的,内存泄露也在所难免——往往泄露的原因是使用了系统资源而没有正确回收所导致的。比如写文件时程序突然崩溃,GC未参于回收等原因,部分系统资源需要显式回收(使用终结器或Disposable接口),而这类似的情况都会造成内存的泄露(电显式回收是说明使用的资源没有经过GC回收器所以要显式回收)。
所以在net编程时防止内存泄露的,对于非托资源的调用时要注意显式回收(写终结器或disposable接口),对于托管资源尽量使用using(已经实现IDisposable接口),防止系统崩溃或无法正常回收资源。
还有一种特殊的情况,它其实已经算是非托资源的一种,就是多线程编程时的线程回收,这个一旦不注意就会出现线程没有正确回收而导致内存泄露。所以对于多线程不熟悉的尽量不要使用底层多线程编程,进行使用线程池或TPL实现。
对于资源未回收导致内存的泄露,本身内容已经超出了.net软件运行的环境,所以对于直接查询来说,需要使用第三方工具(内存泄露查询工具等)本身上对其是无监控的,所以多从代码上分析,除此之外别无他法(根本没有任何途径能告诉是哪行或哪个成员引发的,反过来想想如何能知道是哪行代码引发的,那么GC不直接注意到这行代码在崩溃前直接回收其资源不就可以了)。
所以基本上来说,第五代语言都无法确实什么情况或原因下引了内存泄露,如果编译器或运行JIT能找出的话(不用找出蛛丝马迹),它完全有能力保证不会泄露了。之所以泄露还是他无法监控,超出了该编程译或JIT的能力范围了。所以只能从第三方(直接辅助查询应用程序开辟的内存空间进行记录)来标识内存泄露,也只是标识内存泄露及处理泄露问题,但对于原因它也是*为力的。