JVM-stw
2023-02-23 09:35:56 0 举报
登录查看完整内容
JVM-stop the world
作者其他创作
大纲/内容
实现:当开始检查引用是否为GC Roots的时候,停止其他非垃圾回收线程的工作,直到完成垃圾回收。这也就造成了垃圾回收所谓的暂停时间(GC pause)
可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,线程可以暂停。在 SafePoint 保存了其他位置没有的一些当前线程的运行信息,供其他线程读取。这些信息包括:线程上下文的任何信息,例如对象或者非对象的内部指针等等。我们一般这么理解 SafePoint,就是线程只有运行到了 SafePoint 的位置,他的一切状态信息,才是确定的,值得一提的Java 线程特性也是基于 SafePoint 实现的,那就是 Thread.interrupted(),线程只有到了SafePoint才能知道是否被中断
是什么?
需要具备“是否具有长时间运行指令”的特征。我们知道,CPU资源是时间片段,如果在占用cpu时间比较小的指令位置设置安全点,线程的中断操作导致的全局暂停会效果会被放大;反之,在需要长时间运行的指令位置进行中断操作,延迟效果会被覆盖
jvm是如何判断哪些代码需要放置SafePoint?
1.定时进入 SafePoint,-XX:GuaranteedSafepointInterval(默认是1000ms),针对这点进行优化将该值改为0
2.gc垃圾回收
经过即时编译器优化的代码,都会在方法返回之前放置一个SafePoint
可数循环优化:通常,HotSpot JVM 会在循环中添加一个safepoint 轮询,以便在 JVM 需要执行 stop the world 操作时暂停线程,Safepoint 轮询不是免费的(也就是说,它有一些性能开销)。因此 JIT 编译器会在可能的情况下尝试消除它。其中一个优化是从 counted loops中删除 safepoint 轮询。那么什么是 counted loops(可数循环) 呢?你程序里面的 for(int i=0;i<1000000000;i++ 是一个典型的 counted loops,for int i就是可数循环,for long i就是不可数循环,就是有明确的循环计数器变量,而且该变量有明确的起始值、终止值、步进长度的循环font color=\"#7bd144\
3.JIT(即时编译)优化
4.Class redefinition,由于涉及到类重定义,需要修改栈上和这个类相关的信息
5.Biased lock revocation 取消偏向锁,高并发的情况下,偏向锁会经常失效,导致需要取消偏向锁,取消偏向锁的时候,只会暂停偏向线程span style=\
6.Various debug operation,例如:dump和dead check
什么情况会进入SafePoint?
抢占式中断:抢占式中断不需要线程的执行代码去主动配合,当触发GC时,JVM会中断所有线程,然后依次检查每个线程中断的位置是否为Safepoint,如果不是则恢复线程,让它执行至Safepoint再进行中断
主动式中断:设置一个标志位,用户线程执行过程中,不停的主动轮询这个标志,一旦发现中断标志为真,自己就在最近的安全点上主动中断挂起。这个轮询是否需要进入安全点的动作在每个安全点时发生,这个动作被称之为polling point,polling也有开销,这也是HotSpot并没在每个字节码指令都放置一个safepoint的原因
中断策略
SafePoint
如果某个线程并没有在执行时怎么办?例如某个线程正在Sleep或者Blocked,那这些线程是无法走到安全点的。为了解决这个问题我们引入安全区域(safe regoin)这个概念,你可以把它理解为一个扩大的安全点(某个不会不会发生引用关系变化的区域)例如:线程被挂起,或者线程执行JNI(java native interface)函数等等
是什么?
SaveRegion
触发SafePoint/SafeRegion的奇怪案例
Stop the world
0 条评论
回复 删除
下一页