马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。系列文章目次索引:《你必需晓得的.NET》
本文将先容以下内容:
1.弁言
懂得.NET的内存办理机制,起首应当从内存分派入手下手,也就是对象的创立环节。对象的创立,是个庞大的历程,次要包含内存分派和初始化两个环节。比方,对象的创立历程能够暗示为:
FileStreamfs=newFileStream(@"C:"temp.txt",FileMode.Create);
经由过程new关头字操纵,即完成了对FileStream范例对象的创立历程,这一看似复杂的操纵面前,却履历着相称庞大的历程和周折。
本篇全文,恰是对这一操纵面前历程的具体会商,从中懂得.NET的内存分派是怎样完成的?
2.内存分派
关于内存的分派,起首应当懂得分派在那里的成绩。CLR办理内存的地区,次要有三块,分离为:
·线程的仓库,用于分派值范例实例。仓库次要由操纵体系办理,而不受渣滓搜集器的把持,当值范例实例地点办法停止时,其存储单元主动开释。栈的实行效力高,但存储容量无限。
·GC堆,用于分派小对象实例。假如援用范例对象的实例巨细小于85000字节,实例将被分派在GC堆上,当有内存分派大概接纳时,渣滓搜集器大概会对GC堆举行紧缩,概况见后文报告。
·LOH(LargeObjectHeap)堆,用于分派年夜对象实例。假如援用范例对象的实例巨细不小于85000字节时,该实例将被分派到LOH堆上,而LOH堆不会被紧缩,并且只在完整GC接纳时被接纳。
本文会商的重点是.NET的内存分派机制,因而下文将不加申明的以GC堆上的分派为例来睁开。关于值范例和援用范例的叙述,请拜见[第八回:咀嚼范例---值范例与援用范例(上)-内存有理]。
懂得了内存分派的地区,接着我们看看有哪些操纵将招致对象创立和内存分派的产生,关于实例创立有多个IL指令剖析,次要包含:
·newobj,用于创立援用范例对象。
·ldstr,用于创立string范例对象。
·newarr,用于分派新的数组对象。
·box,在值范例转换为援用范例对象时,将值范例字段拷贝到托管堆上产生的内存分派。
在上述叙述的基本上,上面从仓库的内存分派和托管堆的内存分派两个方面来分离叙述.NET的内存分派机制。
关于值范例来讲,一样平常创立在线程的仓库上。但并不是一切的值范例都创立在线程的仓库上,比方作为类的字段时,值范例作为实例成员的一部分也被创立在托管堆上;装箱产生时,值范例字段也会拷贝在托管堆上。
关于分派在仓库上的部分变量来讲,操纵体系保护着一个仓库指针来指向下一个自在空间的地点,而且仓库的内存地点是由高位到低位向下添补。以下例而言:
假定线程栈的初始化地点为50000,因而仓库指针起首指向50000地点空间。代码由出口函数Main入手下手实行,起首进进感化域的是整型部分变量x,它将在栈上分派4Byte的内存空间,因而仓库指针向下挪动4个字节,则值100将保留在49997~50000单元,而仓库指针暗示的下一个自在空间地点为49996,如图所示:
<br>
publicstaticvoidMain()
{
intx=100;
charc="A";
}
接着进进下一行代码,将为字符型变量c分派2Byte的内存空间,仓库指针向下挪动2个字节至49994单元,值’A’会保留在49995~49996单元,地点的分派如图:
<br>
最初,实行到Main办法的右括号,办法体实行停止,变量x和c的感化域也随之停止,必要删除变量x和c在仓库内存中的值,其开释历程和分派历程恰好相反:起首删除c的内存,仓库指针向上递增2个字节,然后删除x的内存,仓库指针持续向上递增4个字节,程序实行停止,此时的内存情况为:
<br>
其他较庞大的分派历程,大概在感化域和分派巨细上有所分歧,可是基础历程迥然不同。栈上的内存分派,效力较高,可是内存容量不年夜,同时变量的保存周期跟着办法的停止而灭亡。
未完待续:托管堆的内存分派机制和需要的增补申明,近期公布,敬请存眷。
<br>
参考文献
(USA)JoeDuffy,Professinal.NETFramework2.0
(USA)DonBox,Essiential.NET
(MSDN)HanuKommalapatiandTomChristian,DrillInto.NETFrameworkInternalstoSeeHowtheCLRCreatesRuntimeObjects,http://msdn.microsoft.com/msdnmag/issues/05/05/JITCompiler/default.aspx
|