|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你觉得学习.NET怎么样,我懂的少,问的可能很幼稚,见笑了啊:)实在吧,内存保守一向是个使人头疼的成绩,在带有GC的言语中这个情形失掉了很年夜的恶化,可是仍旧大概会有成绩。
1、甚么是内存保守(memoryleak)?
内存保守不是指内存坏了,也不是值内存没插稳漏出来了,复杂来讲,内存保守就是在你等候的工夫内你程序所占用的内存没有依照你设想中的那样被开释。
因而甚么是你等候的工夫呢?分明这点很主要。假如一个对象占用内存的工夫和包括这个对象的程序一样长,可是你其实不希冀是如许。那末就能够以为是内存保守了。器具格式子来讲明以下:
- classButton{publicvoidOnClick(objectsender,EventArgse){...}}classProgram{staticeventEventHandlerButtonClick;staticvoidMain(string[]args){Buttonbutton=newButton();ButtonClick+=button.OnClick;}}
复制代码
下面这段代码中,我们利用了一个静态的事务,而静态成员的性命周期是从AppDomain被加载入手下手,直到AppDomain被卸载,也就是说在一般情形下假如历程没被封闭,又健忘作废注册事务,那末ButtonClick事务包括的EventHandler托付所援用的对象会一向存在到历程停止为止,这就形成了内存保守成绩。这也是.NET中最多见的内存保守成绩的缘故原由之一。前面我会接着说怎样办理这类事务酿成的保守成绩。
2、内存接纳的体例
1、援用计数
援用计数的寄义是跟踪纪录每一个值被援用的次数。当声了然一个变量并将一个援用范例值赋给该变量时,则这个值的援用次数就是1。假如统一个值又被赋给另外一个变量,则该值的援用次数加1。相反,假如包括对这个值援用的变量又获得了别的一个值,则这个值的援用次数减1。当这个值的援用次数酿成0时,则申明没有办法再会见这个值了,因此就能够将其占用的内存空间接纳返来。如许,当渣滓搜集器下次再运转时,它就会开释那些援用次数为零的值所占用的内存。
像本来IE6中Javascript华夏生对象内存接纳的体例就是经由过程反省对象是不是有援用来判别一个对象是不是是渣滓。IE9之前,其BOM和DOM中的对象是利用C++以COM对象的情势完成的,而COM对象的渣滓搜集机制接纳的也是援用计数战略。而这类体例一般会由于轮回援用招致内存保守,也就是A援用B的同时,B也援用者A。在ObjectC中也会有如许的轮回援用的成绩。在ObjectC中的办理计划就是给一方标志为weak,先容能够参看这里,关于ObjectC中的托付形式的先容。
2、标志扫除法(mark-weep)
C#中接纳的是标志法接纳内存,全体对象都要标志,而且只标志一次就不再标志。判别一个对象是否是渣滓取决因而否有援用,而是取决是是不是被root援用。
root的范例有存放器中的变量,线程栈上的变量,静态变量等。
我们来看一幅一般情形下的对象图,图中有一个轮回援用。
<pstyle="margin:10pxauto;font-family:blackVerdana,Arial,Helvetica,sans-serif;line-height:21px;"> |
|