网站大量收购闲置独家精品文档,联系QQ:2885784924

GC与的内存管理.ppt

  1. 1、本文档共38页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
GC与的内存管理

GC与内存管理 对象创建及生命周期 一个对象的生命周期简单概括就是:创建使用释放,在.NET中一个对象的生命周期: new创建对象并分配内存 对象初始化 对象操作、使用 资源清理(非托管资源) GC垃圾回收 就是对象的创建,大部分的对象创建都是开始于关键字new,个别引用类型是由专门IL指令的 托管堆 托管堆中的对象是顺序存放的,托管堆维护着一个指针NextObjPtr,它指向下一个对象在堆中的分配位置。 创建对象流程 对象大小估算,共计40个字节: 属性Age值类型Int,4字节; 属性Name,引用类型,初始为NULL,4个字节,指向空地址; 字段_Name初始赋值了,由前面可知,代码会被编译器优化为_Name=”123abc”。一个字符两个字节,字符串占用2×6+8(附加成员:4字节TypeHandle地址,4字节同步索引块)=20字节,总共内存大小=字符串对象20字节+_Name指向字符串的内存地址4字节=24字节; 引用类型字段Liststring?_Names初始默认为NULL,4个字节; User对象的初始附加成员(4字节TypeHandle地址,4字节同步索引块)8个字节; 内存申请: 申请44个字节的内存块,从指针NextObjPtr开始验证,空间是否足够,若不够则触发垃圾回收。 内存分配: 从指针NextObjPtr处开始划分44个字节内存块。 对象初始化: 首先初始化对象附加成员,再调用User对象的构造函数,对成员初始化,值类型默认初始为0,引用类型默认初始化为NULL; 托管堆指针后移: 指针NextObjPtr后移44个字节。 返回内存地址: 返回对象的内存地址给引用变量。 GC垃圾回收 GC是垃圾回收(Garbage Collect)的缩写,是.NET核心机制的重要部分。基本工作原理就是遍历托管堆中的对象,标记哪些被使用对象(那些没人使用的就是所谓的垃圾),然后把可达对象转移到一个连续的地址空间(也叫压缩),其余的所有没用的对象内存被回收掉。 GC堆里面为了提高内存管理效率等因素,有分成多个部分,其中 两个主要部分 : 0/1/2代:代龄(Generation) 大对象堆(Large Object Heap),大于85000字节的大对象会分配到这个区域,这个区域的主要特点就是:不会轻易被回收;就是回收了也不会被压缩(因为对象太大,移动复制的成本太高了); 垃圾 简单理解就是没有被引用的对象 垃圾回收 标记 先假设所有对象都是垃圾,根据应用程序根指针Root遍历堆上的每一个引用对象,生成可达对象图,对于还在使用的对象(可达对象)进行标记(其实就是在对象同步索引块中开启一个标示位)。 其中Root根指针保存了当前所有需要使用的对象引用,只是一个统称,意思就是这些对象当前还在使用,主要包含:静态对象/静态字段的引用;线程栈引用(局部变量、方法参数、栈帧);任何引用对象的CPU寄存器;根引用对象中引用的对象;GC Handle table;Freachable队列等。 “f”明显代表“终结”(finalization);freachable队列中的每个记录项都是对托管堆中的一个对象的引用,该对象的Finalize方法应该被调用。“reachable”意味着对象是可达的。换言之,可将freachable队列看成是像静态字段那样的一个根。因此,如果一个对象在freachable队列中,它就是可达的,不是垃圾。 简单地说,当一个对象不可达,垃圾回收器就把它视为垃圾。但是,当垃圾回收器将对象的引用从终结列表移至freachable队列时,对象不再被认为是垃圾,其内存不能被回收。标记freachable对象时,这些对象的引用类型的字段也会被递归地标记;所有这些对象都会在垃圾回收过程中存活下来。到这个时候,垃圾回收器才结束对垃圾的标识。由于一些原本被认为是垃圾的对象被重新认为不是垃圾,所以从某种意义上说,这些对象“复活”了。然后,垃圾回收器开始压缩(compact, 使得紧凑)可回收的内存,特殊的CLR线程清空freachable队列,并执行每个对象的Finalize方法。 清除 针对所有不可达对象进行清除操作,针对普通对象直接回收内存,而对于实现了终结器的对象(实现了析构函数的对象)需要单独回收处理。清除之后,内存就会变得不连续了,就是步骤3的工作了 压缩 把剩下的对象转移到一个连续的内存,因为这些对象地址变了,还需要把那些Root跟指针的地址修改为移动后的新地址。 垃圾回收的过程示意图如下 : 垃圾回收的过程是不是还挺辛苦的,因此建议不要随意手动调用垃圾回收GC.Collect(),GC会选择合适的时机、合适的方式进行内存回收的。 代龄 分代(Generation)算法是CL

文档评论(0)

liwenhua00 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档