.net内存泄露

.net内存泄露

ID:26004351

大小:120.00 KB

页数:18页

时间:2018-11-24

.net内存泄露_第1页
.net内存泄露_第2页
.net内存泄露_第3页
.net内存泄露_第4页
.net内存泄露_第5页
资源描述:

《.net内存泄露》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、.Net内存泄露原因及解决办法4.1Dispose()的使用4.2using的使用4.3事件的卸载4.4API的调用1.4.6弱引用(WeakReference)2.4.7析构函数(Finalize())1.什么是.Net内存泄露(1).NET应用程序中的内存您大概已经知道,.NET应用程序中要使用多种类型的内存,包括:堆栈、非托管堆和托管堆。这里我们需要简单回顾一下。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。在运行库的控制下执行的代码称作托管代码。相反,在运行库之外运行的

2、代码称作非托管代码。COM组件、ActiveX接口和Win32API函数都是非托管代码的示例。COM/COM++组件,ActiveX控件,API函数,指针运算,自制的资源文件...这些的非托管的,其它就是托管的.在CLR上编译运行的代码就是托管代码。 非CLR编译运行的代码就是非托管代码 。非托管代码用disposefreeusing释放 。即使在拥有GC的托管堆上,也有可能发生内存泄漏!堆栈堆栈用于存储应用程序执行过程中的局部变量、方法参数、返回值和其他临时值。堆栈按照每个线程进行分配,并作为每个线程完

3、成其工作的一个暂存区。垃圾收集器并不负责清理堆栈,因为为方法调用预留的堆栈会在方法返回时被自动清理。但是请注意,垃圾收集器知道在堆栈上存储的对象的引用。当对象在一种方法中被实例化时,该对象的引用(32位或64位整型值,取决于平台类型)将保留在堆栈中,而对象自身却存储于托管堆中,并在变量超出范围时被垃圾收集器收集。非托管堆非托管堆用于运行时数据结构、方法表、Microsoft中间语言(MSIL)、JITed代码等。非托管代码根据对象的实例化方式将其分配在非托管堆或堆栈上。托管代码可通过调用非托管的Win32

4、®API或实例化COM对象来直接分配非托管堆内存。CLR出于自身的数据结构和代码原因广泛地使用非托管堆。托管堆托管堆是用于分配托管对象的区域,同时也是垃圾收集器的域。CLR使用分代压缩垃圾收集器。垃圾收集器之所以称为分代式,是由于它将垃圾收集后保留下来的对象按生存时间进行划分,这样做有助于提高性能。所有版本的.NETFramework都采用三代分代方法:第0代、第1代和第2-18-代(从年轻代到年老代)。垃圾收集器之所以称为压缩式,是因为它将对象重新定位于托管堆上,从而能够消除漏洞并保持可用内存的连续性。

5、移动大型对象的开销很高,因此垃圾收集器将这些大型对象分配在独立的且不会压缩的大型对象堆上。有关托管堆和垃圾收集器的详细信息,请参阅JeffreyRichter所著的分为两部分的系列文章“垃圾收集器:Microsoft.NETFramework中的自动内存管理”和“垃圾收集器-第2部分:Microsoft.NETFramework中的自动内存管理”。虽然该文的写作是基于.NETFramework1.0,而且.NET垃圾收集器已经有所改进,但是其中的核心思想与1.1版或2.0版是保持一致的。可能很多.NET的

6、用户(甚至包括一些dotNet开发者)对Net的内存泄露不是很了解,甚至会说.Net不存在内存泄露,因为“不是有GC机制吗?----”恩,是有这么回事,它可以让你在通常应用中不用考虑令人头疼的资源释放问题,但很遗憾的是这个机制不保证你开发的程序就不存在内存泄露。甚至可以说,dotNet中内存泄露是很常见的。这是因为:一方面,GC机制本身的缺陷造成的;另一方面,Net中托管资源和非托管资源的处理是有差异的,托管资源的处理是由GC自动执行的(执行时机是不可预知的),而非托管资源(占少部分,比如文件操作,网络连

7、接等)必须显式地释放,否则就可能造成泄露。综合起来说的话,由于托管资源在Net中占大多数,通常不做显式的资源释放是可以的,不会造成明显的资源泄露,而非托管资源则不然,是发生问题的主战场,是最需要注意的地方。另外,很多情况下,衰老测试主要关注的是有没有内存泄露的发生,而对其他泄露的重视次之。这是因为,内存跟其他资源是正相关的,也就是说没有内存泄露的发生,其他泄露的发生概率也较小,其根本原因在于几乎所有的资源最后都会在内存上有所反应。一提到托管代码中出现内存泄漏,很多开发人员的第一反应都认为这是不可能的。毕竟

8、垃圾收集器(GC)会负责管理所有的内存,没错吧?但要知道,垃圾收集器只处理托管内存。基于Microsoft®.NETFramework的应用程序中大量使用了非托管内存,这些非托管内存既可以被公共语言运行库(CLR)使用,也可以在与非托管代码进行互操作时被程序员显式使用。在某些情况下,垃圾管理器似乎在逃避自己的职责,没有对托管内存进行有效处理。这通常是由于不易察觉的(也可能是非常明显的)编程错误妨碍了垃圾收集器的正常工作而造成的

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。