java虚拟机——HotSpot算法实现

枚举根节点

可达性分析从GC Roots节点找引用连,如果逐个检查引用,必然会消耗很多时间。
可达性分析对执行时间的敏感还体现在GC停顿上,因为进行可达性分析时不许在一个能确保一致性的快照中进行,即整个执行系统都像被冻结在某个时间点上。因此GC进行时必须停顿所有java线程。

在HotSpot的实现中,时使用一组成为OopMap的数据结构达到该目的。在类加载完成后,HotSpot就把对象内什么偏移量上市什么类型的数据计算出来。在编译时期,也会在特定的位置记录下栈和寄存器中那些位置是引用。这样在CG扫描时就可以直接指导这些信息。

安全点(Safepoint)

HotSpot只在特定位置记录信息,这些位置称为安全点。程序执行时只有到达安全点才可以停顿下来开始GC。
GC的选择是以“是否具有让程序长时间执行的特征”为标准选择。“长时间特征”指指令序列复用,即方法调用、循环跳转、异常跳转等。

GC时如何让所有线程都到安全点,有两种方案:
1、抢先式中断
不需要线程主动配合。GC发生时,将所有线程中断,若线程未到安全点,就恢复线程,让它跑到安全点上。
2、主动式中断
设置一个标志,让各个线程主动去轮询这个标志,当发现标志位真时就自己中断挂起。轮询点和安全点是重合的。

安全区域(Safe Region)

安全点是在程序执行时解决进入GC的问题。
安全区域是在程序不执行的时候(如线程处于Sleep状态,没有分配GPU时间)解决进入GC问题。
安全区域指在一段代码片段中,引用关系不会发生变化。在这个区域中任何地方开始GC都是安全的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值