什么是SafePoint
SafePoint是Java代码中的一个线程可能暂停执行的位置。SafePoint保存了在其他位置没 有的一些运行时信息。SafePoint保存了线程上下文中的任何东西,包括对象,指向对象或非 对象的内部指针。
在JVM处于SafePoint时,可以做什么呢?
1、 Garbage collection pauses
2、 Code deoptimization
3、 Flushing code cache
4、 Class redefinition (e.g.hot swap or instrumentation)
5、 Biased lock revocation
6、 Various debug operation (e.g.deadlock check or stacktrace dump)
在JVM源码的注释里提到,当系统要进入SafePoint时,不同状态的Java线程的暂停机制是不一样的:
1、 运行状态的线程必须阻塞。
2、 不与JVM交互的运行Native Code的线程能继续执行(如果需要通过JNI访问Java对 象,调用JAVA方法,从Native回到JAVA的话,则必须等到Safepoint结束)。
3、 所有阻塞中的线程,需要等待SafePoint结束,才能返回。
Java线程是如何进入SafePoint的呢?
1、 每个线程通过检查SafePoint数据结构的状态来确定是否需要暂停自己来进入安全态。
2、 对于编译的代码,JIT通过在代码中适当的位置插入SafePoint检查的代码(通常在调用的返回和循环的退出)
JIT会在所有方法的返回之前,以及所有非counted loop的循环(无界循环)回跳之前放置 一个SafePoint,防止发生GC需要STW时,该线程一直不能暂停。
3、 对于解释的代码,JVM保存了两张字节码的执行表,如果需要进行SafePoint检查,JVM会 在两张表之间切换。
通常safepoint有三种状态:
1、 not_synchronized:正常运行状态。
2、 synchronizing: VM Thread 正在等待所有线程进入 safepoint。
3、 synchronized:所有线程进入safepoint, VM Thread可以开始工作了。
程序运行时,可以设置 JVM 参数 -XX:+PrintSafepointStatistics –
XX:PrintSafepointStatisticsCount=l 来输出 SafePoint 的统计信息。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.