Jvm垃圾收集器总结(ParNew收集器)

ParNew收集器其实就是Serial 收集器的多线程版本,除了多条线程进行垃圾收集之外,其余行为包括 Serial 收集器的所有控制参数(例如: -XX:SurvivorRatio、-XX:PretenureSizeThreshold、-XX:HandlePromotionFailure 等)、收集算法、Stop The World、对象分配规则、回收策略等都与 Serial 收集器完全一样,在现实上,这两种收集器也共用了相当多的代码。ParNew 收集器的工作过程如下图所示。

Jvm垃圾收集器总结(ParNew收集器)

ParNew 收集器除了多线程收集之外,其他与 Serial 收集器相比并没有太多了创新之处,但它却是许多运行在 Server 模式下的虚拟机中首选的新生代收集器,其中一个与性能无关但很重要的原因是,除了 Serial 收集器之外,目前只有它能与 CMS 收集器配合工作。在 JDK1.5时期,HotSpot 推出了一款在强交互应用中几乎可认为有划时代意义的垃圾收集器 — CMS 收集器(Concurrent Mark Sweep)这款收集器是 HotSpot 虚拟机中第一款真正意义的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作,举例来说就是做到了在你妈妈打扫房间时你还能一边往地上扔纸屑。

不幸的是,CMS 作为老年代收集器,却无法与 JDK1.4 中已经存在的 Parallel Scavenge 配合工作①,所以在 JDK1.5 中使用 CMS 来收集老年代的时候,新生代只能选 ParNew 或者 Serial 中的一个。ParNew 收集器也是使用 -XX:UseConcMarkSweepGC 选项后的默认新生代收集器,也可以使用 -XX:UseParNewGC 来强制指定它。

ParNew 收集器在单 CPU 环境中绝对不会有比 Serial 收集器更好的效果,甚至由于线程交互的开销,该收集器在通过超线程技术实现的两个 CPU 的环境中都不能百分百保证超过 Serial 收集器。当然,随着可用 CPU 的数量增加,它对于 GC 时系统资源的利用还是很有好处的。它默认开启的收集线程数与 CPU 的数量相同,在 CPU 非常多(譬如 32 个,现在 CPU 动辄就 4 核加超线程,服务器超过 32 个逻辑 CPU 的情况越来越多了)的情况下,可以使用 -XX:ParallelGCThreads 参数来限制垃圾收集的线程数。

Tips

并发与并行:
从 ParNew 收集器开始,还有很多并发和并行收集器。并发和并行都是并发编程中的概念,在谈垃圾收集器的上下文语境中,它们可以解释如下。

  • 并行(Parallel)指多条垃圾收集线程并行工作,但此时用户线程处于等待状态。
  • 并发(Concurrent)指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能是交替执行),用户程序在继续运行,而垃圾收集程序运行在另一个 CPU 上。

备注:
① Parallel Scavenge 收集器及后面的 G1 收集器都没有使用传统的GC收集器代码框架,而是另外独立实现,其余收集器则共用了部分框架代码,详细内容可以参考:http://blogs.sun.com/jonthecollector/entry/our_collectors

上一篇:面试官:说一下JVM常用垃圾回收器的特点、优劣势、使用场景和参数设置


下一篇:【树莓派】树莓派TXD、RXD的配置与使用可实现与STM32的通信