ParNew
和 Parallel Scavenge
是 Java 虚拟机 (JVM) 中的两种新生代垃圾收集器,它们的主要区别在于优化目标和使用场景。以下是它们的主要区别:
1. 优化目标
- ParNew:其设计目标是为了在 响应时间 上进行优化,适合与 CMS (Concurrent Mark-Sweep) 老年代垃圾收集器一起使用。它更注重最小化停顿时间,以减少垃圾收集对应用程序的影响,因此适合需要较短 GC 暂停时间的应用。
- Parallel Scavenge:则关注吞吐量,它的目标是提高系统的总体处理能力,也就是应用程序运行时间与垃圾收集时间的比率。Parallel Scavenge 通过提高垃圾收集的效率来减少应用程序的总执行时间,因此适合对吞吐量要求较高的应用场景,比如批处理或计算密集型应用。
2. 是否与 CMS 配合使用
- ParNew:专为与 CMS 一起使用而设计的年轻代垃圾收集器,是 CMS 的默认搭档。因此,在老年代使用 CMS 时,ParNew 是首选的新生代收集器。
- Parallel Scavenge:通常与 Parallel Old(其老年代垃圾收集器)一起使用,不与 CMS 搭配。Parallel Scavenge 的整体设计更倾向于吞吐量优先,而非响应时间优先。
3. GC 调优策略
- ParNew:主要可以通过调整
-XX:ParallelGCThreads
来控制并行线程的数量,但是对垃圾回收行为的其他方面并没有特别复杂的调优选项。 - Parallel Scavenge:提供了更多专门针对吞吐量和暂停时间的调优参数。例如,
-XX:MaxGCPauseMillis
用于控制最大 GC 停顿时间,-XX:GCTimeRatio
用于控制垃圾收集时间与总时间的比率。这样,它可以通过这些参数平衡吞吐量和 GC 停顿时间。
4. 历史
- ParNew:相对较老,出现在早期的 JVM 实现中,它基本上是对 Serial GC 的并行化版本。
- Parallel Scavenge:是后来专门为吞吐量优化设计的垃圾收集器,尤其适用于多核环境下的高效并行垃圾回收。
5. 使用建议
- ParNew:适合对低延迟有要求的应用,特别是与 CMS 老年代垃圾回收器配合使用的情况下,比如响应时间敏感的服务器应用。
- Parallel Scavenge:适合对高吞吐量有要求的场景,如批量处理任务或对暂停时间不敏感的应用。
总结:
- ParNew 是为与 CMS 老年代回收器搭配而设计的,主要关注最小停顿时间和响应时间。
- Parallel Scavenge 是注重吞吐量的垃圾收集器,更多应用于批处理任务和对暂停时间要求不敏感的应用场景。
你可以根据具体应用的需求来选择最合适的垃圾收集器。