虚拟机3.4 HotSpot算法实现

来源:互联网 发布:shellshock windows 编辑:程序博客网 时间:2024/06/11 18:02

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过程),若完成,则线程继续执行,否则需等待可以离开的信号。

原创粉丝点击