JVM高级特性-五、Java Hotspot VM 算法实现之可达性分析

有关可达性分析的基础介绍可参看JVM高级特性-三、垃圾收集之判断对象存活算法中的内容

下面将详细介绍下再HotSpot中是如何实现的

   

一、枚举根节点

 

  问题:

  • 在从gc root向下查找引用链时,可作为GC ROOT的节点主要在全局性引用(常量、静态变量)和执行上下文(栈帧中的本地变量表),通常方法区就有数百兆,逐个检查消耗会很大
  • 在查找引用链过程中,需要保证引用链的一致性,即在分析过程中对象的引用关系不能再变化,否则分析准确性则无法得到保证

   因此通常GC执行时会stop the world,停止所有执行线程,即使几乎不发生停顿的CMS收集器中,枚举根节点也是需要停顿的。

  OopMap:

   在HotSpot中,使用的是一种称为OopMap的数据结构来存储对象内什么偏移量存储的是什么类型的数据的映射关系,在JIT编译
   过程中,也会在特定位置记录下栈和寄存器中的那些位置和引用的,这样GC在扫描时就可以直接获得这些信息。

 

二、安全点(safe point)

   概念:

      实际上,JVM并非为所有指令都生成OopMap,只是在特定位置记录这些信息,这些位置就成为安全点。即,程序并非在所

      有地方都能停顿下来执行GC,只有在到达安全点时,才可以将线程停顿下来GC。

 

    选定:

      安全点的选定通常是以是否能让程序长时间执行的特征选定的。例如方法调用、执行跳转、异常跳转等处。

 

    暂停线程方案:

      在GC发生时需要让线程停顿下来,让线程停顿下来的方案有两种,抢先式中断主动式中断

 

      • 抢先式中断:

          在GC发生时先中断所有线程,如果线程不在安全点上,则启动该线程使其执行到安全点后挂起。

          几乎已没有虚拟机只用此种方式

      • 主动式中断:

          不需要直接对线程进行操作,在线程执行时主动轮询这个标识,若中断标识为真,在线程自己中断挂起

          这个标识和安全点是重合的        

     

 三、安全区域(safe region)

    上面的安全点检查仿佛完全解决了如何进入GC的问题,但只有安全点还是不够的,安全点只解决了那些在运行的程序,保证了他们可以运行到安全点并挂起,但如果有些线程此时并未执行,例如处于sleep或blocked状态的线程,就无法响应JVM的中断请求,这是就用到了安全区域

    定义:

      安全区域是指在此区域内,对象的引用关系不会发生变化(即不会影响枚举根节点)

    原理:

      当线程运行到安全区域时会将自己标识,在JVM准备进行GC时将视这些线程为安全的,不影响GC,当线程运行完毕要离开安全区域时,线程会检查JVM是否在枚举根节点,若是,则等待完成后再离开安全区域继续执行。

    

posted @ 2017-06-18 18:42  onlinemf  阅读(4879)  评论(0编辑  收藏  举报