5.1.2.HotSpot的算法实现
可达性分析算法
1.枚举根节点(GC Roots)
问题:1.应用中的引用太多,如果逐个检查,会消耗很多时间
2.GC停顿消耗时间 GC停顿:可达性分析算法必须保证一致性,分析期间系统好像被冻结,即在分析过程中对象引用关系不能发生变化。————“Stop The World”
解决:1.准确式GC:虚拟机可以知道内存中的某个位置的数据具体是什么类型。
实现:使用OopMap的数据结构,在类加载完成时,把对象内什么偏移量上是什么类型的数据计算出来;在JIT编译过程中也会在特定的位置记录下栈和寄存器中哪些位置是引用。
2.安全点(Safepoint)和安全区域(Safe Region)
安全点:1.Hotspot不需要为每条指令生成OopMap记录,Hotspot仅在特定位置记录,这些特定的位置成为安全点。
2.安全点的选定以“程序是否具有让程序长时间执行的特征”为标准。单条指令的执行时间很短,长时间执行的特征是指令序列复用,例如方法调用、循环跳转、异常跳转等。
3.HotSpot开始GC时要求所有线程必须在安全点位置。
实现:1.抢先式中断(现在几乎不使用)
不需要线程主动配合,当GC发生时,将所有线程中断,若发现某线程中断位置不再安全点,就让线程继续执行到安全点。
2.主动式中断(主流)
当GC需要中断线程时,设置一个标志,各线程执行时在安全点时主动轮询这个标志,当发现中断标志为真就自己中断挂起
问题:当程序未执行(线程处于 Sleep或Block状态)时,线程无法响应JVM的中断请求,执行到安全点
解决: 安全区域(扩展的安全点):在一片代码段中,引用关系不会发生变化。
思想:当线程进入安全区域时,首先标识自己已经进入了安全区域,当这段时间发生GC时,就不用管表示自己为安全区域 状态的线程。当线程要离开安全区域时要先检查系统是否已完成根节点枚举(或者是整个GC过程),如果完成了,那线程继续执行,否则它必须等待直到收到可以安全离开的信号为止。
可达性分析算法
1.枚举根节点(GC Roots)
问题:1.应用中的引用太多,如果逐个检查,会消耗很多时间
2.GC停顿消耗时间 GC停顿:可达性分析算法必须保证一致性,分析期间系统好像被冻结,即在分析过程中对象引用关系不能发生变化。————“Stop The World”
解决:1.准确式GC:虚拟机可以知道内存中的某个位置的数据具体是什么类型。
实现:使用OopMap的数据结构,在类加载完成时,把对象内什么偏移量上是什么类型的数据计算出来;在JIT编译过程中也会在特定的位置记录下栈和寄存器中哪些位置是引用。
2.安全点(Safepoint)和安全区域(Safe Region)
安全点:1.Hotspot不需要为每条指令生成OopMap记录,Hotspot仅在特定位置记录,这些特定的位置成为安全点。
2.安全点的选定以“程序是否具有让程序长时间执行的特征”为标准。单条指令的执行时间很短,长时间执行的特征是指令序列复用,例如方法调用、循环跳转、异常跳转等。
3.HotSpot开始GC时要求所有线程必须在安全点位置。
实现:1.抢先式中断(现在几乎不使用)
不需要线程主动配合,当GC发生时,将所有线程中断,若发现某线程中断位置不再安全点,就让线程继续执行到安全点。
2.主动式中断(主流)
当GC需要中断线程时,设置一个标志,各线程执行时在安全点时主动轮询这个标志,当发现中断标志为真就自己中断挂起
问题:当程序未执行(线程处于 Sleep或Block状态)时,线程无法响应JVM的中断请求,执行到安全点
解决: 安全区域(扩展的安全点):在一片代码段中,引用关系不会发生变化。
思想:当线程进入安全区域时,首先标识自己已经进入了安全区域,当这段时间发生GC时,就不用管表示自己为安全区域 状态的线程。当线程要离开安全区域时要先检查系统是否已完成根节点枚举(或者是整个GC过程),如果完成了,那线程继续执行,否则它必须等待直到收到可以安全离开的信号为止。