您的位置:首页 > 其它

虚拟机3.4 HotSpot算法实现

2017-11-09 11:58 197 查看
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过程),若完成,则线程继续执行,否则需等待可以离开的信号。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: