《深入理解Java虚拟机》读书笔记之——HotSpot的算法实现

1.1 枚举根节点

在HotSpot的实现中,利用OopMap数据结构来记录对象内什么偏移量是什么类型的数据之类的,JIT编译的时候也会记录。GC扫描的时候去扫描OopMap就可以了,而无需一个不漏地检查完所有执行上下文和全局的引用位置。

1.2 安全点

安全点
大多数垃圾收集器进行gc的时候,需要进行stop the world ,停止jvm所有的线程,只有所有线程都到达这个点的时候,才可以进行gc,这个点就是安全点。

对于gc收集器来讲,如何在gc时候快速到达安全点是一个关键点,有以下两种方式(现在基本都用的是主动式中断):

  • 抢先式中断:无需线程配合,gc时,把所有线程全部中断,如果有线程中断的地方不在安全点就恢复该线程,让他跑到安全点上。
  • 主动式中断:gc需要中断线程的时候,不直接对线程操作,简单的设置一个标志,各线程轮询这个标志,发现中断标志为真的时候,就自己中断挂起,轮询标志的地方和安全点是重合的,另外再加上创建对象需要分配内存的地方。

1.3 安全区域

在线程sleep或者blocked的时候是没办法主动轮询中断标志的,也就无法响应gc的中断请求,这种情况下,就诞生了安全域。

安全域:在一段代码里,引用关系不会变,在这段代码的任何地方gc都是安全的。

在线程执行到安全域的时候就标识自己已经进入安全域,然后jvm要gc的时候就不用管这些进入安全域的线程了,线程离开安全域的时候,会检测系统是否完成了GC。

你可能感兴趣的:(《深入理解Java虚拟机》读书笔记之——HotSpot的算法实现)