深入探索JVM垃圾回收:ARM服务器垃圾回收的挑战和优化
上QQ阅读APP看书,第一时间看更新

2.5.4 JVM内部并发线程进入安全点

在虚拟机内部也有一些并发线程,这些线程可能访问Java堆中的对象,也可能并不访问Java堆中的对象。

对于不访问Java堆的线程,例如一些周期性统计线程,仅仅统计虚拟机内部的信息,在整个执行过程中都不访问Java堆,所以对GC完全没有影响,在执行GC操作时无须暂停,不会影响GC的正确性。

对于可能访问Java堆空间对象的并发线程,在GC执行前也需要进入安全点。内部线程进入安全点的方式也是在一些控制代码处主动检查是否需要进入安全点,如果需要进入安全点,则会主动挂起自己,等待GC结束后通过信号量唤醒继续执行,所以在虚拟机内部需要编写额外的代码主动检查是否需要进入安全点。另外,由于虚拟机内部线程可以访问堆空间,为保证GC执行后的正确性,需要特别处理堆空间的对象访问。一种实现是虚拟机内部不直接访问堆空间的对象,而是通过间接方式,例如通过Handle的方式,在GC执行结束后调整Handle,以便线程能正确地访问对象;另外一种实现是虚拟机在进入安全点以后,在GC执行过程中将线程需要处理的对象处理完,待GC完成后,JVM内部并发线程总是从一个全新的状态继续执行。