Java并发并行GC

Java并发并行GC,java,garbage-collection,concurrency,Java,Garbage Collection,Concurrency,本文建议使用-XX:+UseParNewGC“启用并行年轻一代GC和并发GC” 我的困惑是,为了同时启用并行和并发GC,我应该 使用-XX:+UseParNewGC或 同时使用-XX:+UseParNewGC和-XX:+UseConcMarkSweepGC 附言 我使用的是JVM 6。因为您链接的文档是针对1.4.2虚拟机的,我假设您使用的是1.4.2虚拟机(JVM 5和6的行为不同) 从 如果-XX:+UseConcMarkSweepGC用于 命令行将显示该标志 如果 未在上以其他方式显式

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

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

  • 使用
    -XX:+UseParNewGC
  • 同时使用
    -XX:+UseParNewGC
    -XX:+UseConcMarkSweepGC
附言
我使用的是JVM 6。

因为您链接的文档是针对1.4.2虚拟机的,我假设您使用的是1.4.2虚拟机(JVM 5和6的行为不同)

如果-XX:+UseConcMarkSweepGC用于 命令行将显示该标志 如果 未在上以其他方式显式设置 命令行

因此,答案是您只需要使用-XX:+useConMarkSweepGC,它将启用并发收集器和并行年轻一代收集器


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

此博客条目详细介绍了不同的收集器,以及哪些选项是有效的:

java/JDK 6 GC调优:。这是来自太阳报(现在是甲骨文)。全部内容

另请参见


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


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

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

您不能同时启用两个GC选项。我建议您使用CMS,与UseParNewGC相比,CMS和下一代GC更好。如果你使用java 1.7或更高版本,堆大小相对较大(比如>4GB)考虑使用G1..P>你使用的是哪种JVM版本?1.4.2与5或6之间存在一些差异。表达“年轻一代”可能会引起一些混淆,在本文中,这与堆中Java对象的年龄有关(而不是GC的现代程度)。我仍然不明白,因此,要启用并行年轻一代GC和并发GC,我必须同时使用concmarksweepgc和parnewgc,还是只使用concmarksweepgc?只需-XX:+UseConcMarkSweepGC,我认为UseParNewGC标志没有效果(甚至可能导致错误)在Java6中,您可以使用Java-XX:+PrintCommandLineFlags-XX:+UseConMarkSweepGC-version=>-XX:+UseParNewGC检查是否自动设置。(使用1.6.0_26进行测试)。您能否解释一下“如果您不与其他进程共享机器(因此闲置内核只是浪费),请使用ConcMarkSweepGC。”?