Java并发和并行GC

本文中的这篇文章build议使用-XX:+UseParNewGC “使用并行GC启用平行年轻代GC”。

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

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

PS

我正在使用JVM 6。

由于你链接的文档是一个1.4.2的虚拟机,我假设你正在使用(JVMs 5和6的行为不同)。

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

如果在命令行上使用了-XX:+ UseConcMarkSweepGC,那么如果在命令行中没有明确设置,UseParNewGC标志也会被设置为true

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

编辑:对于Java 6,相同的标志(-XX:+ UseConcMarkSweepGC)启用并发收集器。 你想要的收集器的select取决于几件事情,你应该testing不同的configuration。 但是有一些非常一般的指导方针。 如果你有一个处理器,单线程机器,那么你应该使用串行收集器(默认的一些configuration,可以显式使用-XX:+ UseSerialGC)。 对于工作负载基本上与CPU绑定的多处理器机器,请使用并行收集器。 如果使用-server标志,则默认情况下启用,或者可以使用-XX:+ UseParallelGC显式启用它。 如果您宁愿将GC暂停的时间缩短到使用更多的CPU总CPU时间,并且您拥有多个CPU,则可以使用并发收集器(-XX:+ UseConcMarkSweepGC)。 请注意,对于给定的工作负载,并发收集器往往需要比串行或并行收集器更多的RAM分配给JVM,因为可能发生一些内存碎片。

java / JDK 6 GC调优: http : //www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html 。 这是来自SUN(现在的Oracle)。 充分的东西。

另外,请参阅
http://kirk.blog-city.com/is_your_concurrent_collector_failing_you.htm
http://www.javaperformancetuning.com/

这个博客文章有不同的collections家细分,哪些选项是有效的: http : //blogs.oracle.com/jonthecollector/entry/our_collectors

Java GC调优基本上是一个黑暗的艺术,但在我的应用程序(运行50 + GB堆,16物理内核)ConcMarkSweep收集器导致3倍加速 – 超过服务器的默认值,和2.2倍的速度超过ParallelOldGC。

如果您没有与其他进程共享机器(因此空闲内核只是浪费)使用ConcMarkSweepGC。

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

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