new关键字发生了什么系列补充(HotSpot如何实现垃圾收集)

前言

这篇文章是为了补充系列(三)中的垃圾收集算法在HotSpot中是实现

枚举根节点

枚举根节点就是根据可达性分析从gc roots中分析垃圾,但是gc roots节点有很多(常量、静态属性、栈帧中的本地变量表),如果逐个检查会很消耗性能。

问题:gc root太多不能逐个检查,怎么办?

HotSpot在类加载完成之后,就把对象内的什么偏移量上是什么类型的数据计算出来,在JIT编译过程中,也会在待定的位置记录下栈和寄存器中哪些位置是引用,这样gc在扫描的时候就知道了。具体是使用一组叫OopMap的数据结构来完成的

安全点

问题:不能为每条指令生成OopMap,会消耗额外空间,提高了gc空间成本

HotSpot只在特定位置记录这些信息,称为安全点(Safepoint)

问题:如何在gc发生时让所有线程都跑到最近的安全点

抢先式中断:不需要线程的执行代码主动配合,在GC发生时,中断所有线程,没有跑到安全点的线程恢复执行,让它跑到安全点(现在虚拟机几乎不采用该方式)
主动式中断:GC时,设置一个标志,各个线程不断轮询,发现中断标志就自己中断挂起,轮询标志和安全点是重合的

安全区域

问题:如果线程在Sleep或Blocked状态发生GC怎么处理?

此刻线程无法响应JVM的中断请求(无法轮询标志),此刻需要安全区域(Safe Region)。在安全区域中代码引用不会发生变化,在这个区域中任意地方开始GC都是安全的。可是说是扩展了的安全点。
JVM发生GC的时候不会管标识自己为Safe Region状态的线程。线程离开Safe Region的时候检查是否完成枚举根节点或者gc,完成了继续执行,否则等待收到可以离开的信号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值