Java并发和并行GC

时间:2008-10-21 00:15:55

标签: java garbage-collection concurrency

本文here建议使用-XX:+UseParNewGC“使用并发GC启用并行年轻代GC”。

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

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

PS

我正在使用JVM 6.

6 个答案:

答案 0 :(得分:38)

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

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

  

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

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

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

答案 1 :(得分:7)

此博客条目包含不同收藏家的细分,以及哪些选项有效:http://blogs.oracle.com/jonthecollector/entry/our_collectors

答案 2 :(得分:7)

答案 3 :(得分:5)

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

如果您不与其他进程共享计算机(因此闲置核心只是浪费),请使用ConcMarkSweepGC。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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