仓酷云

标题: NET网页编程之.net内存分派剖析 [打印本页]

作者: 因胸联盟    时间: 2015-1-16 14:20
标题: NET网页编程之.net内存分派剖析
Java欺骗了我们那么多年,如今的多核时代,我认为它气数已尽!在剖析内存分派时,应当先懂得关于仓库的区分
堆的分派向洼地址扩大,而栈的分派向低地点扩大。
二。内存分派


关于内存的分派,起首应当懂得分派在那里的成绩。CLR办理内存的地区,次要有三块,分离为:
·线程的仓库,用于分派值范例实例。仓库次要由操纵体系办理,而不受渣滓搜集器的把持,当值范例实例地点办法停止时,其存储单元主动开释。栈的实行效力高,但存储容量无限。

·GC堆,用于分派小工具实例。假如援用范例工具的实例巨细小于85000字节,实例将被分派在GC堆上,当有内存分派大概接纳时,渣滓搜集器大概会对GC堆举行紧缩,概况见后文报告。
NET网页编程之.net内存分派剖析
登录/注册后可看大图

LoaderHeap最主要的信息就是元数据相干的信息,也就是Type工具,每一个Type在LoaderHeap上表现为一个MethodTable,而MethodTable中则纪录了存储的元数据信息,比方基范例,静态字段,完成的接口,一切的办法等。LoaderHeap不受GC把持,其性命周期从创立到AppDomain卸载。

示例代码以下:
publicclassVIPUser:User
{
//分派1Byte
publicboolisVip;
publicboolIsVipUser()
{
returnisVip;
}
staticvoidMain(string[]args)
{
//分派内存空间和初始化操纵
VIPUseraUser;
//将工具援用赋给aUser变量,创建aUser和VIPUser的联系关系
aUser=newVIPUser();
//Q:范例的分派的字节数?
//就本类而言必要15Byte。可是实例工具所占的字节总数还要加上工具附加成员所需的字节数,个中包含附加成员TypeHandle和SyncBlockIndex共8个字节。在托管堆上分派的字节总数为23字节,而堆上的内存块老是依照4Byte的倍数举行分派,因而本类中将分派24字节的地点空间

//最初挪用工具机关器,举行工具初始化操纵,完成创立

//机关历程
//a.机关VIPUser范例的Type工具,次要包含静态字段、办法表、完成的接口等,并将其分派在上文提到托管堆的LoaderHeap上。

//b.初始化aUser的两个附加成员:TypeHandle和SyncBlockIndex。将TypeHandle指针指向LoaderHeap上的MethodTable,CLR将依据TypeHandle来定位详细的Type;将SyncBlockIndex指针指向SynchronizationBlock的内存块,用于在多线程情况下对实例工具的同步操纵。

//c.挪用VIPUser的机关器,举行实例字段的初始化。实例初始化时,会起首向上递回实行父类初始化,直到完成System.Object范例的初始化,然后再前往实行子类的初始化,直到实行VIPUser类为止。以本例而言,初始化历程为起首实行System.Object类,再实行User类,最初才是VIPUser类。终极,newobj分派的托管堆的内存地点,被传送给VIPUser的this参数,并将其援用传给栈上声明的aUser。

aUser.isVip=true;
Console.WriteLine(aUser.IsVipUser());
//上述历程,基础完成了一个援用范例创立、内存分派和初始化的全部流程
}
}
publicclassUserInfo
{
//分派4个字节
privateInt32age=-1;
//分派2个字节
privatecharlevel=A;
}
publicclassUser
{
//分派4byte
privateInt32id;
//保留了UserInfo的援用占用4Byte
//仅是一个援用(指针),保留在线程的仓库上,占用4Byte的内存空间用于保留user工具的无效地点如今试图对user的任何操纵将抛出NullReferenceException
privateUserInfouser;
}

·LOH(LargeObjectHeap)堆,用于分派年夜工具实例。假如援用范例工具的实例巨细不小于85000字节时,该实例将被分派到LOH堆上,而LOH堆不会被紧缩,并且只在完整GC接纳时被接纳。

在懂得内存分派之前起首懂得一下三个观点:
·TypeHandle,范例句柄,指向对应实例的办法表,每一个工具创立时都包括该附加成员,而且占用4个字节的内存空间。我们晓得,每一个范例都对应于一个办法表,办法表创立于编译时,次要包括了范例的特性信息、完成的接口数量、办法表的slot数量等。

·SyncBlockIndex,用于线程同步,每一个工具创立时也包括该附加成员,它指向一块被称为SynchronizationBlock的内存块,用于办理工具同步,一样占用4个字节的内存空间。

·NextObjPtr,由托管堆保护的一个指针,用于标识下一个新建工具分派时在托管堆中所处的地位。CLR初始化时,NextObjPtr位于托管堆的基地点。

三。承继实质论


NET网页编程之.net内存分派剖析
登录/注册后可看大图

办法表的创立是类第一次加载到AppDomain时完成的,在工具创立时只是将其附加成员TypeHandle指向办法列表LoaderHeap上的地点与其静态办法列表相干联起来,因而办法暗示先于工具存在的。
//Birdbird创立的是一个工具的援用,而newBird()是创立Bird工具,分派内存和初始化操纵,然后将工具援用赋给bird变量,也就是简历bird和Bird之间的联系关系
Birdbird=newBird();
//2.从承继的角度来剖析CLR在运转时怎样实行工具的创立历程
//2.1起首是字段的创立字段的存储按次由上到下分列,最高层类的字段排在最后面
//2.2办法表的创立是类第一次加载到AppDomain时完成的,在工具创立时只是将其附加成员TypeHandle指向办法列表LoaderHeap上的地点,将工具与其静态办法列表相干联起来,因而办法暗示先于工具存在的。
Chickench=newChicken();
在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。
作者: 谁可相欹    时间: 2015-1-18 13:14
弱类型造成潜在的出错可能:尽管弱数据类型的编程语言使用起来回方便一些,但相对于它所造成的出错几率是远远得不偿失的。
作者: 兰色精灵    时间: 2015-1-24 06:14
市场决定一切,我个人从经历上觉得两者至少在很长时间内还是要共存下去,包括C和C++,至少从找工作就看得出来,总不可能大家都像所谓的时尚一样,追捧一门语言并应用它。
作者: 简单生活    时间: 2015-1-31 22:10
主流网站开发语言之CGI:CGI就是公共网关接口(CommonGatewayInterface)的缩写。它是最早被用来建立动态网站的后台技术。这种技术可以使用各种语言来编写后台程序,例如C,C++,Java,Pascal等。
作者: 蒙在股里    时间: 2015-2-7 01:38
众所周知,Windows以易用而出名,也因此占据不少的服务器市场。
作者: 飘灵儿    时间: 2015-2-19 12:25
JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。
作者: 老尸    时间: 2015-3-13 03:53
大哥拜托,Java在95年就出来了,微软垄断个妹啊,服务器市场微软完全是后后来者,当年都是Unix的市场,现在被WindowsServer和Linux抢下大片,包括数据库也一样。
作者: 金色的骷髅    时间: 2015-3-20 11:59
平台无关性是PHP的最大优点,但是在优点的背后,还是有一些小小的缺点的。如果在PHP中不使用ODBC,而用其自带的数据库函数(这样的效率要比使用ODBC高)来连接数据库的话,使用不同的数据库,PHP的函数名不能统一。这样,使得程序的移植变得有些麻烦。不过,作为目前应用最为广泛的一种后台语言,PHP的优点还是异常明显的。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2