- 1、本文档共38页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- CPU 313C (6ES7313-5BG04-0AB0) 的操作系统更新.docx
- CRM整体数据框架及数据定义.doc
- CT成像技术概述.ppt
- CT成像原理介绍(英文版).ppt
- CT灌注成像在肿瘤.ppt
- C段地图和流程图范文.docx
- C盘windows下面各个文件夹的含义.docx
- C语言300行 投篮.docx
- D2D通信资源复用分配奖惩加权算法研究滑思忠.pdf
- C盘文件清理.doc
- 2025年广西中考地理二轮复习:专题四+人地协调观+课件.pptx
- 2025年广西中考地理二轮复习:专题三+综合思维+课件.pptx
- 2025年中考地理一轮教材梳理:第4讲+天气与气候.pptx
- 第5讲+世界的居民课件+2025年中考地理一轮教材梳理(商务星球版).pptx
- 冀教版一年级上册数学精品教学课件 第1单元 熟悉的数与加减法 1.1.6 认识1-9 第6课时 合与分.ppt
- 2025年中考一轮道德与法治复习课件:坚持宪法至上.pptx
- 2025年河北省中考一轮道德与法治复习课件:崇尚法治精神.pptx
- 八年级下册第二单元+理解权利义务+课件-2025年吉林省中考道德与法治一轮复习.pptx
- 精品解析:湖南省娄底市2019-2020学年八年级(上)期中考试物理试题(原卷版).doc
- 2025年中考地理一轮教材梳理:第10讲+中国的疆域与人口.pptx
最近下载
- ZZ027 全国职业院校技能大赛(中职组) 婴幼儿保育赛项理论题第3套(含答案).doc VIP
- 单片机(李朝青)课后习题答案.pdf
- ZZ027-全国职业院校技能大赛(中职组)-婴幼儿保育赛项第5套(含答案).doc VIP
- 厦门房地产行业报告.pptx VIP
- 普外科手术并发症处理ppt.pptx
- 劳淋(再发性尿路感染)中医临床路径.doc VIP
- 年处理10万吨乙醇-水筛板精馏塔设计说明书2024.12.18.docx
- 2023年2022版数学课程标准复习题.pdf VIP
- 土地利用现状调查方法技术.pdf
- 2022年人教版中考生物复习知识点思维导图 主题五 动物的运动和行为.ppt VIP
文档评论(0)