精选 | 深入浅出解析JVM中的Safepoint
Source :
mp.weixin.qq.com
Author :
Simon
最早接触JVM中的安全点概念是在读《深入理解Java虚拟机》那本书垃圾回收器章节的内容时。相信大部分人也一样,都是通过这样的方式第一次对安全点有了初步认识。不妨,先复习一下《深入理解Java虚拟机》书中安全点那一章节的内容。 书中是在讲解垃圾收集器-垃圾收集算法的章节引入安全点的介绍,为了快速准确地完成GC Roots枚举,避免为每条指令都生成对应的OopMap造成大量存储空间的浪费,只在“特定的位置”生成对应的OopMap,这些位置被称为安全点。然后,书中提到了安全点位置的选择标准是:是否能让程序长时间执行;所以会在方法调用、循环跳转、异常跳转等处才会产生安全点。 书中还提到了JVM如何在GC时让用户线程在最近的安全点处停顿下来:抢先式中断和主动式中断。抢先式中断不需要线程的执行代码主动去配合,在GC发生时,系统首先把所有用户线程全部中断,如果发现有用户线程中断的地方不在安全点上,就恢复这条线程执行,让它一会再重新中断,直到跑到安全点上。而主动式中断的思想是当GC需要中断线程时,不直接对线程操作,仅仅简单地设置一个标志位,各个线程执行过程时不停地主动去轮询这个标志