聊聊JVM(六)理解JVM的safepoint

Safepoint是JVM中的关键概念,主要在GC时发挥作用,确保线程状态可确定以便安全执行操作。安全点选择包括循环末尾、方法返回前等,避免程序长时间不进入Safepoint导致JVM假死。JVM通过在解释和编译代码中插入检查来实现Safepoint,线程主动检查并暂停,以允许如GC等操作。在安全区域(Safe Region)中,即使线程阻塞,JVM也能安全地标记引用。通过参数-XX:+PrintSafepointStatistics –XX:PrintSafepointStatisticsCount=1可查看Safepoint统计信息。
摘要由CSDN通过智能技术生成

safepoint是JVM里面很重要的一个概念,在很多场景下都会看到它,尤其是在GC的时候。这篇讲讲safepoint。本人不是做JVM实现研究的,很多地方只能点到为止,希望能够讲清楚这个概念,具体的细节可以自己去找资料深入研究。


safepoint 安全点顾名思义是指一些特定的位置,当线程运行到这些位置时,线程的一些状态可以被确定(the thread's representation of it's Java machine state is well described),比如记录OopMap的状态,从而确定GC Root的信息,使JVM可以安全的进行一些操作,比如开始GC。

safepoint指的特定位置主要有:

1. 循环的末尾 (防止大循环的时候一直不进入safepoint,而其他线程在等待它进入safepoint)

2. 方法返回前

3. 调用方法的call之后

4. 抛出异常的位置


之所以选择这些位置作为safepoint的插入点,主要的考虑是“避免程序长时间运行而不进入safepoint”,比如GC的时候必须要等到Java线程都进入到safepoint的时候VMThread才能开始执行GC,如果程序长时间运行而没有进入safepoint,那么GC也无法开始,JVM可能进入到Freezen假死状态。在stackoverflow上有人提到过一个问题,由于BigInteger的pow执行时JVM没有插入safepoint,导致大量运算时线程一直无法进入safepoint,而GC线程也在等待这个Java线程进入safepoint才能开始GC,结果JVM就Freezen了。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值