Thread.sleep(0)的作用

Thread.sleep(0)在Java中用于让线程进入Safepoint,以便触发垃圾收集。Safepoint是JVM在执行用户代码时能够暂停的地方。Counted Loop(可数循环)中,JVM优化不放置Safepoint,导致长时间循环可能延长STW。而native方法执行后返回Java线程时,会检查Safepoint。STW是垃圾回收过程中的状态,所有线程暂停,GC线程除外。JVM调优的一个目标是减少STW的停顿时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Thread.sleep(0)可以让线程进入 Safepoint,从而触发GC。

Safepoint

有了安全点的设定,也就决定了用户程序执行时并非在代码指令流的任意位置都能够停顿下来开始垃圾收集,而是强制要求必须执行到达安全点后才能够暂停。

换言之:没有到安全点,是不能 STW,从而进行 GC 的。

意思就是在可数循环(Counted Loop)的情况下,HotSpot 虚拟机搞了一个优化,就是等循环结束之后,线程才会进入安全点。

反过来说就是:循环如果没有结束,线程不会进入安全点,GC 线程就得等着当前的线程循环结束,进入安全点,才能开始工作。

Counted Loop(可数循环)

JVM认为比较短的循环,所以不会放置Safepoint,比如用int作为index的循环。与其对应的是Uncounted loop。

Uncounted loop

JVM会在每次循环回跳之前放置Safepoint,比如用long作为index的循环。所以一个常见的问题是当某个线程跑进了Counted loop时,JVM启动了GC,然后需要等待这个线程把循环跑完才能进入Safepoint,如果这个循环是个大循环,且循环内执行的比较慢,而且不存在其他函数调用产生其他Safepoint,这时就需要等待该线程跑完循环才能从其他位置进入Safepoint,这就导致了其他线程可能会长时间的STW。

Thread.sleep(0)

sleep 方法是一个 native 方法。一个线程在运行 native 方法后,返回到 Java 线程后,必须进行一次 safepoint 的检测。

native方法

当某线程在执行native函数是,这是JVM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值