Java并发和并行GC

问题描述 投票:0回答:6

这篇文章here建议使用

-XX:+UseParNewGC
“启用并行年轻代GC与并发GC”。

我的困惑是,为了同时启用并行和并发GC,我应该吗

  • 使用
    -XX:+UseParNewGC
  • 同时使用
    -XX:+UseParNewGC
    -XX:+UseConcMarkSweepGC
    ?

PS

我使用的是 JVM 6。

java garbage-collection concurrency
6个回答
38
投票

由于您链接的文档适用于 1.4.2 VM,因此我假设您正在使用该 VM(JVM 5 和 6 的行为不同)。

来自 http://java.sun.com/docs/hotspot/gc1.4.2/

如果 -XX:+UseConcMarkSweepGC 用于 命令行然后是标志 UseParNewGC 也设置为 true 如果 没有另外明确设置 命令行

所以答案是你只需要使用 -XX:+UseConcMarkSweepGC ,它将启用并发收集器和并行年轻代收集器。

编辑:对于 Java 6,相同的标志(-XX:+UseConcMarkSweepGC)启用并发收集器。您想要的收集器的选择取决于一些因素,并且您应该测试不同的配置。但有一些非常通用的指导方针。如果您有单处理器、单线程机器,那么您应该使用串行收集器(某些配置的默认值,可以使用 -XX:+UseSerialGC 显式启用)。对于工作负载基本上受 CPU 限制的多处理器计算机,请使用并行收集器。如果您使用 -server 标志,则默认启用此功能,或者您可以使用 -XX:+UseParallelGC 显式启用它。如果您希望缩短 GC 暂停时间,但代价是使用更多的总 CPU 时间进行 GC,并且您有多个 CPU,则可以使用并发收集器 (-XX:+UseConcMarkSweepGC)。请注意,对于给定的工作负载,并发收集器往往需要比串行或并行收集器分配给 JVM 更多的 RAM,因为可能会出现一些内存碎片。



7
投票

此博客条目对不同收集器进行了很好的细分,以及哪些选项有效:http://blogs.oracle.com/jonthecollector/entry/our_collectors


5
投票

Java GC 调优基本上是一门黑暗艺术,但在我的应用程序(使用 50+GB 堆和 16 个物理核心运行)中,ConcMarkSweep 收集器比 -server 默认值提高了 3 倍,比 ParallelOldGC 提高了 2.2 倍。

如果您不与其他进程共享机器(因此闲置核心就被浪费了),请使用 ConcMarkSweepGC。


2
投票

ParNew 是使用 CMS 时默认的年轻代收集器。使用 CMS 时只需指定 -XX:+UseConcMarkSweepGC 即可默认使用 ParNew。如果避免 GC 抖动具有更高的优先级,那么 CMS 是一个很好的收集器,但如果吞吐量更重要,例如对于像批处理这样的作业,则默认的 SUN 并行收集器会做得更好。


0
投票

您不能同时启用两个 GC 选项。我建议您使用比 UseParNewGC 更好的 CMS 和下一代 GC。如果您使用 Java 1.7 或更高版本并且堆大小相对较大(例如 > 4GB),请考虑使用 G1。

© www.soinside.com 2019 - 2024. All rights reserved.