内存泄漏问题

内存泄漏问题

ID:28377233

大小:74.00 KB

页数:4页

时间:2018-12-09

内存泄漏问题_第1页
内存泄漏问题_第2页
内存泄漏问题_第3页
内存泄漏问题_第4页
资源描述:

《内存泄漏问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、、什么是内存泄露(memoryleak)?内存泄露不是指内存坏了,也不是指内存没插稳漏出来了,简单来说,内存泄露就是在你期待的时间内你程序所占用的内存没有按照你想象中的那样被释放。因此什么是你期待的时间呢?明白这点很重要。如果一个对象占用内存的时间和包含这个对象的程序一样长,但是你并不期望是这样。那么就可以认为是内存泄露了。用具体例子来说明如下:classButton{publicvoidOnClick(objectsender,EventArgse){•••}}classProgram{staticeventEventHandlerButtonclick;sta

2、ticvoidMain(string[]args){Buttonbutton=newButton();ButtonClick+=button.OnClick;}}上面这段代码中,我们使用了一个静态的事件,而静态成员的生命周期是从AppDomain被加载开始,直到AppDomain被卸载,也就是说在通常情况下如果进程没被关闭,乂忘记取消注册事件,那么ButtonClick事件包含的EventHandler委托所引用的对象会一直存在到进程结束为止,这就造成了内存泄露问题。这也是.NET中最常见的内存泄露问题的原因Z-o后面我会接着说怎么解决这种事件造成的泄露问题。二、

3、内存回收的方式1、引用计数引用计数的含义是跟踪记录每个值被引用的次数。当声明了-•个变量并将一个引川类型值赋给该变量时,则这个值的引川次数就是1。如果同一个值乂被赋给另一个变量,则该值的引川次数加1。相反,如果包含对这个值引用的变量又取得了另外一个值,则这个值的引川次数减1。当这个值的引用次数变成0时,则说明没有办法再访问这个值了,因而就可以将具占用的内存空间回收回來。这样,当垃圾收集器卜-次再运行时,它就会释放那些引川次数为零的值所占用的内存。像原来IE6中Javascript中原生对象内存回收的方式就是通过检查对象是否冇引用来判断-个对象是否是垃圾。丨E9之前

4、,其BOM和DOM中的对象是使用C++以COM対象的形式实现的,而COM对象的垃圾收集机制采用的也是引用计数策略。而这种方式通常会因为循环引用导致内存泄鉤,也就是A引用B的同时,B也引用者A。在Objective-C中也会有这样的循环引用的问题。在Objective・C中的解决方案就是给-•方标记为weak,介绍可以参看这里,关于Objective・C中的委托模式的介绍。2^标记清除法(mark-weep)C#小采用的是标记法冋收内存,全部对象都要标记,并且只标记一次就不再标记。判断一个对象是不是垃圾取决于是否有引用,而是取决是是否被root引用。root的类型冇

5、寄存器中的变量,线程栈匕的变量,静态变量等。我们来看一幅通常情况下的对彖图,图中冇一个循环引用。我们抽取其中一部分图说明在采用标记清除策略的实现中,由于函数执行Z后,Iocal3出栈,离开了作用域,因此这种相互引用在标记清除法中不是个问题。我们很容易看出,因为每一个对彖都要mark,因此创建大量的小对彖会给Mark阶段造成压力。值得注意的是,在GC的mark和weep阶段,会挂起所有线程,因此创建大量的线程也是会对GC造成问题。这个问题我以后会再讨论。三、弱引用解决一些问题如前面所说,忘记取消注册事件通常是.NET屮最常见的内存泄露问题,我们怎么白动化的解决这个问

6、题呢?也就是说当方法所属的对象己经被标记为垃圾的时候,我们就在事件屮取消注册这个方法。这时就可以通过弱引用来实现。委托的本质就是一个类,包含了几个关键属性:1.指向原对象的TargetB性(强引用)。2.一•个指向方法的ptr指针。3.内部维护着一个集合(delegate是以链表结构实现)。因为.NET中的委托是强引用,我们要把它改成弱引用,我们对以抓住这个这些特征,创建一个口己的WeakDelegate类。事件的本质就是一个访问器方法,和委托的关系类似于字段和属性,也就是控制外部对字段的访问。我们可以通过自定义add和remove方法来把外部的委托转换成我们口己

7、定义的委托。publicclassButton{privateclassWeakDelegate{publicWeakReferenceTarget;publieMethodinfoMethod;}privateList();publiceventEventHandlerClick{add{clickSubscribers.Add(newWeakDelegate{Target=newWeakReference(value.Target),Method=value・Me

8、thod}

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

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

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