HotSpot的算法实现

1、枚举根节点
        进行可达性分析时,在整个分析期间不可以出现对象引用关系变化的情况,因此必须停顿所有的Java执行线程(Sun称为“Stop The World”)。如果逐个检查GC Roots节点(包括方法区中的常量或类的静态属性、栈帧中的本地变量表中的属性)中的引用,会导致停顿时间过长,影响程序性能。
        HotSpot使用一组称为OopMap的数据结构来记录程序中的引用,类加载完成时,计算出对象内各偏移量上的数据类型,在JIT编译过程中,在特定的位置记录下栈和寄存器中哪些位置是引用,GC扫描时可以直接获取这些信息,快速准确地完成GC Roots枚举。
2、安全点
        由于引用关系变化导致OopMap内容变化的指令非常多,如果为每一条指令都生成对应的OopMap,会大大提高GC的空间成本。
        HotSpot只在安全点(SafePoint)记录OopMap,即程序执行到安全点才能暂停。安全点的选取既不能太少导致GC等待时间过长,也不能太多导致GC过于频繁。由于每条指令的执行时间都很短,所以具有让程序长时间执行的指令序列复用(方法调用、循环跳转、异常跳转等)才会产生安全点。
        在GC发生时让所有线程(不包括执行JNI调用的线程)都到最近的安全点停顿下来,有两种方案:
        抢先式中断(几乎没有虚拟机采用):GC发生时,中断所有线程,如果有线程没在安全点中断,就恢复线程使其跑到安全点上停顿。
        主动式中断:GC需要中断线程时,设置一个标志,由各个线程在安全点位置主动轮询这个标志,中断标志为真时自己中断挂起。
3、安全区域
        安全点机制解决了程序在执行时如何在合适的时间进入GC的问题,但是程序不执行时(没有分配到CPU时间,如处于Sleep和Blocked状态的线程无法响应JVM的中断请求,也就无法走到安全点去中断挂起),需要安全区域(Safe Region,引用关系不会发生变化的一段代码,在此区域中任意位置GC都是安全的)来解决。
        线程执行到安全区域的代码时,先标记自己已进入安全区域,在这段时间发生的GC不用管标记为进入安全区域状态的线程。线程要离开安全区域时,需要检查系统是否已经完成了根节点枚举或整个GC过程,如果已完成,线程继续执行,否则必须等待直到收到可以安全离开安全区域的信号为止。


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值