生活垃圾回收器是怎么实现的?

生活垃圾回收器是怎么实现的... 生活垃圾回收器是怎么实现的 展开
 我来答
股票红小斌
2020-07-21 · TA获得超过1570个赞
知道小有建树答主
回答量:1434
采纳率:59%
帮助的人:109万
展开全部
垃圾回收器(Garbage Collector)是CLR 里的一个功能,所以它只能处理CLR所管辖范围内的代码内存(即托管内存)
垃圾回收期会检查托管堆中是否有应用程序不再使用的任何对象。如果有,他们的内存就可以回收。
原理:
JIT编译器生成本地代码时,还会创建一个内部使用的表。从逻辑上来讲,该表中的每个记录项都代表在方法的本地CPU指令中的一个字节偏移范围,针对每个范围,这个记录项都记录了包含着根的一组内存地址和CPU寄存器。(这个记录项的每个内存地址和CPU寄存器即是根,根只是抽象的说法)
一、 垃圾回收器开始执行时,它假设堆中的所有对象都是垃圾。垃圾回收器沿着线程栈上行以检查所有根(然后遍历所有类型对象上的所有根),如果发现一个根引用了一个对象,就在对象的“同步块索引字段”上开启一个位(对象就是这样标记的),如果对象里又引用有其他对象,则会遍历所有对象以标识。检查好所有根之后,堆中将包含一组已标记和未标记的对象。不可达的对象所占的内存可以回收。
二、垃圾回收器线性遍历堆,以寻找未标记对象的连续内存。如果发现的内存块比较小,垃圾回收器会忽略它们。但是,如果发现大的、可用的连续内存块,《垃圾回收器会把非垃圾的对象移动到这里以压缩堆》。注:碎片整理的工作,第一次把0代残留对象都压入1代托管堆,0代全部清空!
很自然,移动内存中的对象之后,包含“指向这些对象的指针”的变量和CPU寄存器现在都变得无效。所以,垃圾回收器必须重新访问应用程序的根,并修改他们来指向队形的新内存地址。(另外,如果对象中的字段指向的是另一个已移动了位置的对象,垃圾回收器也要负责改正这些字段。)堆内存压缩之后,托管堆的NextObjPtr 指针将指向紧接在最后一个非垃圾对象之后的位置。
我感觉GC耗费性能主要在第二阶段,第一阶段只不过是一个遍历标记,没啥复杂度,瞬间会结束,而第二阶段则会压缩标记对象,清空未标记对象,更主要的是对应根的内存地址和CPU寄存器要相应的改变,这是比第一阶段要复杂多的算法!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式