深入理解Java 虚拟机(周志明)笔记(五)——垃圾收集器(二)

 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过程),如果完成了,那线程继续执行,否则它必须等待直到收到可以安全离开的信号为止。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值