欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

垃圾回收器的原理

发布时间:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的这篇文章主要介绍了 垃圾回收器的原理 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

  垃圾回收器(Garbage Collector)是CLR 里的一个功能,所以它只能处理CLR所管辖范围内的代码内存(即托管内存)

  垃圾回收期会检查托管堆中是否有应用程序不再使用的任何对象。如果有,他们的内存就可以回收。

  原理:

    JIT编译器生成本地代码时,还会创建一个内部使用的表。从逻辑上来讲,该表中的每个记录项都代表在方法的本地CPU指令中的一个字节偏移范围,针对每个范围,这个记录项都记录了包含着根的一组内存地址和CPU寄存器。(这个记录项的每个内存地址和CPU寄存器即是根,根只是抽象的说法)

   一、 垃圾回收器开始执行时,它假设堆中的所有对象都是垃圾。垃圾回收器沿着线程栈上行以检查所有根(然后遍历所有类型对象上的所有根),如果发现一个根引用了一个对象,就在对象的“同步块索引字段”上开启一个位(对象就是这样标记的),如果对象里又引用有其他对象,则会遍历所有对象以标识。检查好所有根之后,堆中将包含一组已标记和未标记的对象。不可达的对象所占的内存可以回收。

  二、垃圾回收器线性遍历堆,以寻找未标记对象的连续内存。如果发现的内存块比较小,垃圾回收器会忽略它们。但是,如果发现大的、可用的连续内存块,《垃圾回收器会把非垃圾的对象移动到这里以压缩堆》。注:碎片整理的工作,第一次把0代残留对象都压入1代托管堆,0代全部清空!

       很自然,移动内存中的对象之后,包含“指向这些对象的指针”的变量和CPU寄存器现在都变得无效。所以,垃圾回收器必须重新访问应用程序的根,并修改他们来指向队形的新内存地址。(另外,如果对象中的字段指向的是另一个已移动了位置的对象,垃圾回收器也要负责改正这些字段。)堆内存压缩之后,托管堆的NextObjPtr 指针将指向紧接在最后一个非垃圾对象之后的位置。

      我感觉GC耗费性能主要在第二阶段,第一阶段只不过是一个遍历标记,没啥复杂度,瞬间会结束,而第二阶段则会压缩标记对象,清空未标记对象,更主要的是对应根的内存地址和CPU寄存器要相应的改变,这是比第一阶段要复杂多的算法!

转载于:https://www.cnblogs.com/zche/archive/2012/09/17/2688444.html

总结

以上是生活随笔为你收集整理的垃圾回收器的原理的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。