您好,欢迎访问代理记账网站
移动应用 微信公众号 联系我们

咨询热线 -

电话 15988168888

联系客服
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

hotspot的算法实现

可达性分析需要考虑下面两个点:

  • 有很多应用仅仅方法区大小就有数百兆,如果逐一检查引用,则肯定消耗性能,所以不可能这么做
  • 在执行可达性分析时,必须要保证这个过程期间对象的引用关系不能再变化,否则不能保证分析结果正确性,必须要停止所有线程去执行枚举根节点,被称为Stop the World

枚举根节点

OopMap数据解构: 保存GC Roots 节点,避免全局扫描去一一查找。(目前主流java虚拟机都是准确式GC)

安全点

精简指令,为特定位置(安全点: Safepoint)上的指令生成对应的OopMap,暂停进行GC的位置也是在安全点

安全点设置原则: 
1. 不能太少,太少会导致GC等待时间过长 
2. 不能太过于频繁,以致于过分增加运行时的负荷

所以安全点的选定基本都是以“是否具有让程序长时间执行的特征”为标准进行选定–因为每条指令执行的时间都非常短暂,程序不太可能因为指令流长度太长这个原因而过长时间运行,“长时间执行” 的最明显特征就是指令程序复用,例如方法调用,循环调转 ,异常跳转等。所以具有这些功能的指令才会产生SafePoint

GC发生时,让所有线程(不包括执行JNI调用的线程) 都“跑”到最近的安全点上再停顿:

抢先式中断(Preemptive Suspension) : GC发生时,中断全部线程,如果发现线程不在安全点,则恢复让其”跑” 到安全点
主动式中断(Voluntary Suspension ): 设置一个标志,然后采用轮询触发。

安全区域

主要针对没有分配CPU时间的线程,如线程处于Sleep状态或者Blocked状态。这个时候线程无法响应JVM的中断请求。所以需要安全区域来解决。

在线程执行到Safe Region中的代码时,首先标记自己进入了Safe Region,当在这段时间里JVM发起了GC时,就不用管标识自己为Safe Region状态的线程了,在线程要离开了Safe Region时,它要检查系统是否已经完成了根节点枚举(或者是整个GC过程),如果完成了,那线程就继续执行,否则就必须等待可以安全离开Safe Region的信号为止。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进