这篇文章here建议使用
-XX:+UseParNewGC
“启用并行年轻代GC与并发GC”。
我的困惑是,为了同时启用并行和并发GC,我应该吗
-XX:+UseParNewGC
或 -XX:+UseParNewGC
和 -XX:+UseConcMarkSweepGC
?我使用的是 JVM 6。
由于您链接的文档适用于 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,因为可能会出现一些内存碎片。
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/
此博客条目对不同收集器进行了很好的细分,以及哪些选项有效:http://blogs.oracle.com/jonthecollector/entry/our_collectors
Java GC 调优基本上是一门黑暗艺术,但在我的应用程序(使用 50+GB 堆和 16 个物理核心运行)中,ConcMarkSweep 收集器比 -server 默认值提高了 3 倍,比 ParallelOldGC 提高了 2.2 倍。
如果您不与其他进程共享机器(因此闲置核心就被浪费了),请使用 ConcMarkSweepGC。
ParNew 是使用 CMS 时默认的年轻代收集器。使用 CMS 时只需指定 -XX:+UseConcMarkSweepGC 即可默认使用 ParNew。如果避免 GC 抖动具有更高的优先级,那么 CMS 是一个很好的收集器,但如果吞吐量更重要,例如对于像批处理这样的作业,则默认的 SUN 并行收集器会做得更好。
您不能同时启用两个 GC 选项。我建议您使用比 UseParNewGC 更好的 CMS 和下一代 GC。如果您使用 Java 1.7 或更高版本并且堆大小相对较大(例如 > 4GB),请考虑使用 G1。