相关文章:
在了解新生代的垃圾回收器之前,我们先来了解下 Java 虚拟机的运行模式
Java 虚拟机有两种运行模式,分别是 Server 和 Client
-
Client 模式启动速度较快,Server 模式启动较慢
-
当启动稳定后,Server 模式程序运行速度要比 Client 模式快,这是由于 Server 模式启动的 JVM 采用的是重量级的虚拟机,对程序采用了更多的优化;而 Client 模式启动的 JVM 采用的是轻量级的虚拟机
如上所示,列举了一些常见的垃圾收集器,并标明了它们之间的关系以及适用范围,如果两个收集器之间有连线,则说明它们可以搭配使用
这里特别说明下为什么 CMS 不能与 Parallel Scavenge 一起搭配使用,这是由于 Parallel Scavenge 以及 G1 都没有使用传统的 GC 收集器代码框架,而是另外独立实现的,而其余垃圾收集器共用了部分的框架代码,因此它们能够结合在一起相互使用
一、Serial 收集器
-
Serial 收集器采用复制算法,是 Java 中最基本、发展历史最悠久的收集器,在 JDK1.3.1 之前是 Java 虚拟机新生代收集的唯一选择
-
在程序启动的时候,通过使用 -XX:UseSerialGC 参数来指定新生代使用 Serial 收集器来进行回收
-
单线程收集,进行垃圾收集时,必须暂停所有工作线程
- 单线程并不仅仅说明它只会使用一个 CPU 或一条收集线程去完成垃圾收集工作,更重要的是在它进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束
-
简单高效,是 Client 模式下默认的新生代收集器
-
二、ParNew 收集器
-
ParNew 收集器采用复制算法,是 Serial 收集器的多线程版本
-
在程序启动的时候,通过使用 -XX:UseParNewGC 参数来指定新生代使用 ParNew 收集器来进行回收
-
多线程搜集,其余的行为、特点和 Serial 收集器一样
-
单核执行效率不如 Serial 收集器,在多核下执行才有优势
-
单核情况下,ParNew 收集器的执行效率不如 Serial 收集器,因为存在线程开销,不过随着可用 CPU 数量的增加,其对于系统资源的有效利用还是很有好处的
-
默认开启的收集线程数与 CPU 数量相同,在 CPU 数量非常多的情况下,可以通过使用 -XX:ParallelGCThreads 参数来限制垃圾收集的线程数
-
-
是 Server 模式下首选的新生代收集器
-
三、Parallel Scavenge 收集器
-
Parallel Scavenge 收集器采用复制算法,由于跟吞吐量密切相关,也经常被称为 “吞吐量优先” 收集器
-
在程序启动的时候,通过使用 -XX:UseParallelGC 参数来指定新生代使用 Parallel Scavenge 收集器来进行回收
-
Parallel Scavenge 收集器的关注点与其他收集器不同,其他收集器的关注点在于尽可能地缩短垃圾收集时用户线程的停顿时间,而 Parallel Scavenge 收集器更关注的是系统的吞吐量
-
停顿时间短,适用于要与用户交互的程序,良好的响应速度可以提升用户体验;高吞吐量则可以高效率利用 CPU 时间,尽可能快地完成运算任务,主要适合在后台运算而不需要太多交互的任务
-
吞吐量指的是 CPU 用户运行用户代码的时间与 CPU 总消耗时间的比值,即吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间),例如:虚拟机总共运行了 100 分钟,其中垃圾收集花掉了 1 分钟,那么吞吐量就是 99%
-
-
在多核下执行才有优势,是 Server 模式下默认的新生代收集器
-
四、自适应调节策略
-
如果对垃圾收集器运作原理不太了解,以至于在优化过程中遇到困难的时候不知道该怎么办,这时候我们就可以使用 Parallel Scavenge 收集器配合 GC 自适应调节策略来使用
-
GC 自适应调节策略
-
在启动参数中使用 -XX:+UseAdaptiveSizePolicy 参数,其会把内存管理的调优任务交给虚拟机去完成
-
具体地说就是,虚拟机会根据当前系统的运行情况收集性能监控信息,动态调整这些参数以提供最适合的停顿时间或者最大吞吐量
-
五、归纳总结
-
Serial 收集器
-
采用复制算法,单线程收集
-
程序启动时,可以通过
-XX:UseSerialGC
参数来指定新生代使用 Serial 收集器来进行回收 -
是 Client 模式下默认的新生代收集器
-
-
ParNew 收集器
-
采用复制算法,多线程收集
-
程序启动时,可以通过
-XX:UseParNewGC
参数来指定新生代使用 ParNew 收集器来进行回收 -
单核执行效率不如 Serial 收集器,在多核下执行才有优势
-
是 Server 模式下首选的新生代收集器
-
-
Parallel Scavenge 收集器
-
采用复制算法,多线程收集
-
其他收集器关注点在于尽可能地缩短垃圾收集时用户线程的停顿时间,而 Parallel Scavenge 收集器更关注的是系统的吞吐量
-
单核执行效率不如 Serial 收集器,在多核下执行才有优势
-
是 Server 模式下默认的新生代收集器
-
-
吞吐量
- 吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)