Java-JVM-安全点SafePoint
转载声明:
本文系转载自以下文章:
转载仅为方便学习查看,一切权利属于原作者,本人只是做了整理和排版,如果带来不便请联系我删除。
摘要
本文主要是搜集网络上的好文来记录下安全点概念。看了 才发现自己是有多无知,还有很多东西都不清楚,需要多学习啊。
0x01 安全点是什么
OpenJDK官方定义如下:
安全点是在程序执行期间的所有GC Root已知并且所有堆对象的内容一致的点。
从全局的角度来看,所有线程必须在GC运行之前在安全点阻塞。 (作为一种特殊情况,运行JNI代码的线程可以继续运行,因为它们只使用句柄。但在安全点期间,它们必须阻塞而不是加载句柄的内容。)
从本地的角度来看,安全点是一个显着的点,它位于执行线程可能阻止GC的代码块中。 大多数调用点都能当做安全点。
在每个安全点都存在强大的不变量永远保持true不变,而在非安全点可能会被忽视。 编译的Java代码和C / C ++代码都在安全点之间进行了优化,但跨安全点时却不那么优化。 JIT编译器在每个安全点发出GC映射。 VM中的C / C ++代码使用程式化的基于宏的约定(例如,TRAPS)来标记潜在的安全点。
总的来说,安全点就是指,当线程运行到这类位置时,堆对象状态是确定一致的,JVM可以安全地进行操作,如GC,偏向锁解除等。
0x02 安全点分类
本节摘自https://www.zhihu.com/question/29268019/answer/43762165,作者