垃圾回收器分类
如果按照线程数分,可以分为串行垃圾回收器和并行垃圾回收器
串行回收器
同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束
适用场景:单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场景,串行回收器的性能表现可以超过并行回收器和并发回收器。所以串行回收默认被应用在客户端的Client模式下的JVM中。(在并发能力比较强的CPU上,并行回收器产生的停顿时间要短于串行回收器)
并行垃圾回收器
和串行回收器享范,并行收集可以运用多个CPU同时执行垃圾回收,因此提升了应用的吞吐量,不过并行回收仍然与串行回收一样,采用独占式存在STW
如果按照工作模式来分,可以分为并发式垃圾回收器和独占式垃圾回收器
并发式垃圾回收
并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间
独占式垃圾回收器
独占式垃圾回收器一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束。
按碎片处理方式分可以分为压缩式垃圾回收器和非压缩式垃圾回收器
压缩式垃圾回收器
压缩式垃圾回收器会在回收完成后,对存活对象进行压缩整理,消除回收后的碎片。
非压缩式垃圾回收器
非压缩式垃圾回收器会在回收完成后,不会对存活对象进行压缩整理
按工作内存区间分可以分为年轻代垃圾回收器和老年代垃圾回收器
年轻代垃圾回收器
应用于年轻代
老年代垃圾回收器
应用于老年代
评估GC的性能指标
吞吐量:运行用户代码的时间占总运行时间的比例
暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间
内存占用:Java堆区所占的内存大小
垃圾收集开销:吞吐量得补数,垃圾收集所用时间与总运行时间的比例
收集频率:相对于应用程序的执行,收集操作发生的频率。
快速:一个对象从诞生到被回收所经历的时间
其中最重要的就是 吞吐量 暂停时间 内存占用
吞吐量和暂停时间
高吞吐量会让用户觉得程序运行很快。低暂停时间(低延迟)会让用户感觉体验更好(不卡顿)。但是高吞吐量和低暂停时间是一对相互竞争的目标。因为如果选择以吞吐量优先,那么必然需要降低内存回收得执行频率,但是这样会导致GC需要更长的时间来执行内存回收。
如果选择低延迟优先,那么为了将此每次执行垃圾回收的暂停时间,只能提高垃圾回收频率,但是这又引起了年轻代内存的缩减和导致程序吞吐量的下降。
在设计/使用GC算法时,我们必须确定我们的目标:一个GC算法只可能针对两个目标之一或者二者的折衷。<