本文here建议使用-XX:+UseParNewGC
“使用并发GC启用并行年轻代GC”。
我的困惑是,为了启用并行和并发GC,我应该
-XX:+UseParNewGC
或-XX:+UseParNewGC
和 -XX:+UseConcMarkSweepGC
?我正在使用JVM 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)
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/
答案 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。