这是我参与更文挑战的第 25 天,活动详情查看: 更文挑战
垃圾回收相关概念概述(下)
4.垃圾回收的并行与并发
并行
- 并行:指多条垃圾收集器线程并行工作,但此时用户线程仍在等待状态。
- 串行:相较于并行,是单线程执行。
并发
- 用户线程和垃圾回收线程同时执行(不一定并行的,可能是抢占式交替执行),垃圾回收不会停顿用户线程。
5.安全点与安全区域
安全点(Safe Point)
程序执行时并非在所有情况都可以停下来进行GC,只有在特定的位置才能停顿下来执行GC,这些特定位置称为安全点。安全点的设置太少可能导致GC的等待时间太长,如果设置的太多导致频繁的GC影响程序性能。设置安全点最好根据能否让程序长时间执行的特征为标准,比如:选择执行时间较长的指令作为安全点,方法调用、循环跳转、异常跳转等。
在发生GC时,如何保证所有线程都跑到最近的安全点停顿下来呢?
- 抢先式中断(已废弃):先中断所有线程,如果线程不在安全点就恢复线程,让线程跑到安全点。
- 主动式中断:设置一个中断标志,各个线程运行到安全点的时候就轮询这个标志,如果中断标志为真,则自己进行中断挂起。
安全区域(Safe Region)
安全点机制保证了程序执行时,在不太长的时间就会遇到可进入GC的安全点。但是程序不执行的时候呢?如阻塞或sleep中,这时候线程无法响应JVM的中断请求,不能自己走到安全点取挂起,这个时候需要一个安全区域来解决。
安全区域指在一段代码段中,对象的引用关系不会发生改变,在这个区域中的任何位置开始GC都是安全的,也可以把安全区域看作扩大的安全点。