JVM安全点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM安全点相关的知识,希望对你有一定的参考价值。

参考技术A <<深入理解java虚拟机>>中说道GC Roots的节点主要在全局的引用(例如常量或类静态属性)与执行上下文(例如栈帧中的本地变量表)中,但是进行根节点枚举的时候我们并不需要一个不漏地检查完所有执行上下文和全局引用位置, HotSpot中通过使用一组称为OopMap的数据结构,用于直接存放对象引用 ,类加载完成,HotSpot就会把对象内某个偏移位置是否为对象引用记录下来,JIT编译过程中,也会在特定的位置记录下栈和局存起中哪些位置是引用。

所以通过OopMap,jvm可以快速且准确地完成GC Roots枚举,但是 导致引用发生变化的指令非常多,不可能为每一条指令都生成OopMaps ,这也需要大量的额外空间。

于是jvm选择在某些”特定的位置“记录这些信息,这些位置就是“安全点”。程序只有执行到安全点的时候,才能够暂停。但是我们又不希望GC等待时间过长,因此 为了防止程序因指令流原因而长时间等待 ,jvm选择方法调用、循环跳转、异常跳转等功能的指令才会产生安全点。

即安全点就是某些记录线程此时调用栈、寄存器等一些重要的数据区域里什么地方包含了GC要管理的指针(对象引用),而这些对象引用是通过OopMaps结构进行记录的,可以直接通过对OopMaps结构的访问来获得对象的引用。

链接:https://www.jianshu.com/p/ebd9baa9bc0e

以上是关于JVM安全点的主要内容,如果未能解决你的问题,请参考以下文章

JVM安全点

JVM Safepoint 安全点

JVM源码分析之安全点SafePoint

JVM垃圾回收安全点Safe Point

JVM的Stop The World,安全点,黑暗的地底世界 V2.0

通过 JVM 日志来进行安全点分析