浅谈 JVM GC 的安全点与安全区域

OopMap

前文我们说到,JVM 采用的可达性分析法有个缺点,就是从 GC Roots 找引用链耗时。

都说他耗时,他究竟耗时在哪里?
GC 进行扫描时,需要查看每个位置存储的是不是引用类型,如果是,其所引用的对象就不能被回收;如果不是,那就是基本类型,这些肯定是不会引用对象的;这种对 GC 无用的基本类型的数据非常多,每次 GC 都要去扫描,显然是非常浪费时间的。
而且迄今为止,所有收集器在 GC Roots 枚举这一步骤都是必须暂停用户线程的。

那有没有办法减少耗时呢?
一个很自然的想法,能不能用空间换时间? 把栈上的引用类型的位置全部记录下来,这样到 GC 的时候就可以直接读取,而不用一个个扫描了。Hotspot 就是这么实现的,这个用于存储引用类型的数据结构叫 OopMap
OopMap 这个词可以拆成两部分:OopMapOop 的全称是 Ordinary Object Pointer 普通对象指针,Map 大家都知道是映射表,组合起来就是 普通对象指针映射表。

OopMap 的协助下,HotSpot 就能快速准确地完成 GC Roots 枚举啦。

安全点

OopMap 的更新,从直观上来说,需要在对象引用关系发生变化

你可能感兴趣的:(JVM,java,jvm,jvm.gc)