java虚拟机(6)垃圾回收算法实现细节

本文详细介绍了Java虚拟机中的垃圾回收算法实现,包括根节点枚举、安全点、安全区域的概念及其重要性。讨论了如何在垃圾收集过程中,通过OopMap、安全点和安全区域来确保程序执行的高效性和正确性。同时,讲解了记忆集、卡片、写屏障等技术在并发可达性分析中的作用,以及如何解决并发标记过程中的问题,如增量更新和原始快照策略。
摘要由CSDN通过智能技术生成

根节点枚举

以可达性分析算法中从GC Roots集合找引用链这个操作作为介绍虚拟机高效实现的第一个例子。

固定可作为GC Roots的节点主要在全局性的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中。目标明确,但Java应用越做越庞大,方法区的大小就常有数百上千兆,里面的类、常量等更是恒河沙数,检查以这里为起源的引用需耗费大量时间。

主流Java虚拟机使用的都是准确式垃圾收集 ,直接得到哪些地方存放着对象引用的。

HotSpot使用一组称为OopMap的数据结构来达到这个目的。类加载动作完成的时,会把对象内什么偏移量上是什么类型的数据计算出来,在即时编译过程中,在特定的位置记录下栈里和寄存器里哪些位置是引用。这样收集器在扫描时就可以直接得知这些信息了,不需要一个不漏地从方法区等GC Roots开始查找。

安全点

HotSpot 没有为每条指令都生成OopMap, 只是在“特定的位置”记录了引用信息,这些位置被称为安全点(Safepoint)。

程序执行时并非在代码指令流的任意位置都能够停顿下来开始垃圾收集,而是强制要求必须执行到达安全点后才能够暂停。

安全点的选定

  • 不能太少以至于让收集器等待时间过长;
  • 不能太过频繁以至于过分增大运行时的内存负荷。

如何在垃圾收集发生时让所有线程都跑到最近的安全点?

1、抢先式中断(Preemptive Suspensio

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值