虚拟机3.4 HotSpot算法实现

3.4.1 枚举根节点
在类加载完成时,Hotspot会把对象内什么偏移量上是什么类型数据计算出来,在JIT编译时,会记录栈和寄存器中哪些位置是引用。因此在GC扫描时就直接知道这些信息了。
OopMap(Oop:Ordinary Object Pointer,普通对象指针):一个存储了可能成为GC Roots的引用信息的Map,记录了在该类型的对象内什么偏移量上是什么类型的数据。在源代码里面每个变量都是有类型的,但是编译之后的代码就只有变量在栈上的位置了。oopMap就是一个附加的信息,告诉你栈上哪个位置本来是个什么东西。
通过OopMap可以完成GC Roots的枚举.
3.4.2 安全点
在 方法调用、循环跳转、异常跳转这些‘安全点’才会生成OopMap,程序执行到安全点出才有可能GC。
发生GC时,需要所有线程执行到‘安全点’停顿下来。有两种方案:
抢先式中断:在发生GC时,停顿所有线程,如没到达安全点的线程让其恢复后跑到安全点再停顿。
主动式中断:当GC要中断线程时,设置一个中断flag,各个线程轮询这个flag,flag为true,就线程自己中断。
3.4.3 安全区域
当线程被挂起时,无法响应JVM的要求到达‘安全点’,此时就需要线程执行到安全区域,亦可进行GC,当线程离开安全区域时,需检查系统是否完成了根节点枚举(或整个GC过程),若完成,则线程继续执行,否则需等待可以离开的信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值