本文环境 jdk8
如果说 Serial GC 是年轻代中的单线程垃圾收集器,那么 ParNew 收集器则是 Serial 收集器的多线程版本
Par 是 Parallel 的缩写, New:只能处理的是新生代
ParNew 收集器除了采用并行回收的方式执行内存回收外,两款垃圾收集器之间几乎没有任何别。ParNew 收集器在年轻代中同样也是采用复制算法、"Stop- the- World" 机制
ParNew 是很多 JVM 运行在 Server 模式下新生代的默认垃圾收集器
对于新生代,回收次数频繁,使用并行方式高效
对于老年代,回收次数少,使用串行方式节省资源。 (CPU并行需要切换线程,串行可以省去切换线程的资源)
由于 ParNew 收集器是基于并行回收,那么是否可以断定 ParNew 收集器的回收效率在任何场景下都会比 Serial 收集器更高效?
ParNew 收集器运行在多 CPU 的环境下,由于可以充分利用多 CPU、多核心等物理硬件资源优势,可以更快速地完成垃圾收集,提升程序的吞吐量
但是在单个 CPU 的环境下,ParNew 收集器不比 Serial 收集器更高效。虽然 Serial 收集器是基于串行回收,但是由于 CPU 不需要频繁地做任务切换,因此可以有效避免多线程交互过程中产生的一些额外开销
除 Serial 外,目前只有 ParNew GC 能与 CMS 收集器配合工作
在程序中, 开发人员可以通过选项 "-XX: +UseParNewGC" 手动指定使用 ParNew 收集器执行内存回收任务。它表示年轻代使用并行收集器,不影响老年代
-XX:ParallelGCThreads 限制线程数量,默认开启和 CPU 数据相同的线程数