5、HotSpot的算法实现

来源:互联网 发布:手机淘宝如何重新登录 编辑:程序博客网 时间:2024/06/11 20:54

前面了解关于对象的生死判定和垃圾收集算法,而在HotSpot中是怎么实现的呢?

枚举根结点

根据可达性分析算法,GC的时候从GC Roots节点开始找引用链的,而做为GC Roots的节点主要是在全局性引用与执行上下文中,如果逐个检查的话,必然是需要耗费很多时间的。

而执行GC的时候,所有线程是必然要停顿的。因为在执行时,如果对象的引用关系还在不断变化,就无法准确的进行GC了。

不过,主流的虚拟机现在都是采用精确式GC,即执行系统停顿后,并不需要检查全部执行上下文和全局引用位置,而是通过某些方法知道哪些地方存放着对象引用。

在HotSpot中是使用一组称为OopMap的数据结构来达到这个目的的。

安全点

在HotSpot中,特定的位置会使用OopMap来记录信息,这个位置被称为“安全点”。程序执行时到达安全点才能停下来。

安全点的选定是以程序“是否具有让程序长时间执行的特征”为标准选定的————因为每条指令执行时间很短,而长时间执行的最明显特征就是指令序列重复,如方法调用、循环跳转、异常跳转等,所以适合产生安全点。

那么在GC发生时,是如何让线程达到安全点再停顿下来呢。主要有两种方案:抢断式中断和主动式中断

1、抢断式中断

在GC发生时,中断所有线程,如果有线程不在安全点的话就恢复线程,让它到安全点再中断。(这种方式几乎被弃用了)

2、主动式中断

当GC时,简单设置一个标志,各个线程主动去轮询这个标志,标志为真时就自己中断挂起。

安全区域

安全区域是指一段代码片段中,引用关系不发生变化。在这个区域中任何地方GC都是安全的。

如果程序在执行的话,安全点就足以解决了GC问题。但是如果程序没有在运行呢,没在运行也就是说没有分配CPU时间,比如线程处于Sleep或者Blocked状态,这时候就无法响应JVM的中断请求了,这时候就需要用安全区域来处理了。

在线程执行到这个区域时,会先标识自己是安全区域(Safe Region)。当JVM在这段时间内发生GC时,就不用管标识自己为安全区域的线程了。线程离开安全区域时,要检查系统是否完成GC的整个过程(根节点枚举),完成的话就继续执行线程,否则必须等待,直到收到可以安全离开安全区域的信号。

0 0
原创粉丝点击