JVM之垃圾回收器概述的详细解析
垃圾回收器
概述
垃圾收集器分类:
-
按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器
-
除了 CMS 和 G1 之外,其它垃圾收集器都是以串行的方式执行
-
-
按照工作模式分,可以分为并发式垃圾回收器和独占式垃圾回收器
-
并发式垃圾回收器与应用程序线程交替工作,以尽可能减少应用程序的停顿时间
-
独占式垃圾回收器(Stop the world)一旦运行,就停止应用程序中的所有用户线程,直到垃圾回收过程完全结束
-
-
按碎片处理方式分,可分为压缩式垃圾回收器和非压缩式垃圾回收器
-
压缩式垃圾回收器在回收完成后进行压缩整理,消除回收后的碎片,再分配对象空间使用指针碰撞
-
非压缩式的垃圾回收器不进行这步操作,再分配对象空间使用空闲列表
-
-
按工作的内存区间分,又可分为年轻代垃圾回收器和老年代垃圾回收器
GC 性能指标:
-
吞吐量:程序的运行时间占总运行时间的比例(总运行时间 = 程序的运行时间 + 内存回收的时间)
-
垃圾收集开销:吞吐量的补数,垃圾收集所用时间与总运行时间的比例
-
暂停时间:执行垃圾收集时,程序的工作线程被暂停的时间
-
收集频率:相对于应用程序的执行,收集操作发生的频率
-
内存占用:Java 堆区所占的内存大小
-
快速:一个对象从诞生到被回收所经历的时间
垃圾收集器的组合关系:
新生代收集器:Serial、ParNew、Parallel Scavenge
老年代收集器:Serial old、Parallel old、CMS
整堆收集器:G1
-
红色虚线在 JDK9 移除、绿色虚线在 JDK14 弃用该组合、青色虚线在 JDK14 删除 CMS 垃圾回收器
查看默认的垃圾收回收器:
-
-XX:+PrintcommandLineFlags
:查看命令行相关参数(包含使用的垃圾收集器) -
使用命令行指令:jinfo -flag 相关垃圾回收器参数 进程 ID
Serial(串行)
Serial:串行垃圾收集器,作用于新生代,是指使用单线程进行垃圾回收,采用复制算法,新生代基本都是复制算法
STW(Stop-The-World):垃圾回收时,只有一个线程在工作,并且 Java 应用中的所有线程都要暂停,等待垃圾回收的完成
Serial old(串行):执行老年代垃圾回收的串行收集器,内存回收算法使用的是标记-整理算法,同样也采用了串行回收和 STW 机制
-
Serial old 是 Client 模式下默认的老年代的垃圾回收器
-
Serial old 在 Server 模式下主要有两个用途:
-
在 JDK 1.5 以及之前版本(Parallel Old 诞生以前)中与 Parallel Scavenge 收集器搭配使用
-
作为老年代 CMS 收集器的后备垃圾回收方案,在并发收集发生 Concurrent Mode Failure 时使用
-
开启参数:-XX:+UseSerialGC
等价于新生代用 Serial GC 且老年代用 Serial old GC
优点:简单而高效(与其他收集器的单线程比),对于限定单个 CPU 的环境来说,Serial 收集器由于没有线程交互的开销,可以获得最高的单线程收集效率
缺点:对于交互性较强的应用而言,这种垃圾收集器是不能够接受的,比如 JavaWeb 应用