ASP.NET网站制作之[你必需晓得的.NET]第十八回:对象创立委曲(上)仓酷云
学习asp.net两个月有余了,除了对html、web控件比较熟悉(应该是说都能理解和接受)之外,竟不知道自己还会什么。看了两本书:《精通asp.net网络编程》(人民邮电出版社)、《asp.net实用案例教程》(清华大学出版社)。系列文章目次索引:《你必需晓得的.NET》本文将先容以下内容:
[*]对象的创立历程
[*]内存分派剖析
[*]内存结构研讨
<br>
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的内存分派机制。
2.1仓库的内存分派机制
关于值范例来讲,一样平常创立在线程的仓库上。但并不是一切的值范例都创立在线程的仓库上,比方作为类的字段时,值范例作为实例成员的一部分也被创立在托管堆上;装箱产生时,值范例字段也会拷贝在托管堆上。
关于分派在仓库上的部分变量来讲,操纵体系保护着一个仓库指针来指向下一个自在空间的地点,而且仓库的内存地点是由高位到低位向下添补。以下例而言:
假定线程栈的初始化地点为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
代码逻辑混乱,难于管理:由于ASP是脚本语言混合html编程,所以你很难看清代码的逻辑关系,并且随着程序的复杂性增加,使得代码的管理十分困难,甚至超出一个程序员所能达到的管理能力,从而造成出错或这样那样的问题。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。 是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。 但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。 主流网站开发语言之ASP:ASP是微软(Microsoft)所开发的一种后台脚本语言,它的语法和VisualBASIC类似,可以像SSI(ServerSideInclude)那样把后台脚本代码内嵌到HTML页面中。虽然ASP简单易用,但是它自身存在着许多缺陷,最重要的就是安全性问题。 ASP.net的服务器,要求安装一个.net环境,当然我这里指的是windows系统,顺便点一下,.net只能放在windows环境里来运行。Asp.net1.1的就装Framework1.1,Asp.net2.0的就装Framework2.0。 Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。 PHP的源代码完全公开,在OpenSource意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新,使得PHP无论在UNIX或是Win32的平台上都可以有更多新的功能。它提供丰富的函数,使得在程式设计方面有着更好的资源。目前PHP的最新版本为4.1.1,它可以在Win32以及UNIX/Linux等几乎所有的平台上良好工作。PHP在4.0版后使用了全新的Zend引擎,其在最佳化之后的效率,比较传统CGI或者ASP等技术有了更好的表现。 asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦! 在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
页:
[1]