5

我有一个 java 应用程序,它使用尽可能多的 CPU,并使用它,大量内存(高达 80Gb)。

我正在为该应用程序优化 GC,并且我想告诉 JVM 使用给定百分比的时间(60%)来进行 GC,否则机器不在 GC 中的时间量正在处理和分配更多内存。

我想确认该-XX:CMSIncrementalDutyCycle=60参数是我正在寻找的东西,以及是否有任何其他参数可以为 GC 提供更多功能(我已经看过CMSIncrementalPacingand CMSIncrementalDutyCycleMin

非常感谢!

4

3 回答 3

1

我想确认 XX:CMSIncrementalDutyCycle=60 参数是我正在寻找的参数,以及是否有任何其他参数可以为 GC 提供更多功能(我已经看过 CMSIncrementalPacing 和 CMSIncrementalDutyCycleMin)

不,你错了。此标志不会控制分配给 JVM GC 的可用 CPU 百分比。该文档指出:

-XX:CMSIncrementalDutyCycle=<N> default: 50

这是允许并发收集器运行的次要收集之间的时间百分比 (0-100) 。如果启用了 CMSIncrementalPacing,那么这只是初始值。

因此,假设您正在使用 CMS 收集器 ( -XX:+UseConcMarkSweepGC),那么上面的标志控制 CMS 允许在次要 GC 收集之间执行的时间百分比。

没有标志可以让您直接控制 GC 线程执行的时间量。

于 2013-04-01T18:02:35.740 回答
1

无法在 GC 收集期间设置CPU使用率上限

CMSIncrementalDutyCycle用于设置次要收集之间的时间(参见[1]),因此您可以控制 GC 运行的频率,从而间接控制 CPU 使用率。但是,没有任何参数可以让您直接控制 CPU 使用率。

于 2013-04-01T18:02:46.447 回答
1

首先,CMSIncreamentalDutyCycle对增量 CMS 算法的影响(应由 启用-XX:+CMSIncrementalMode)。无论如何,增量模式都不利于您的任务。

其次,您可以限制 GC 任务消耗的 CPU 核心数。

  • -XX:ParallelGCThreads=N为 Stop-the-World 阶段设置核心数
  • -XX:ConcGCThreads=N设置并发任务的核心数(仅适用于 CMS)

您可以在此处找到更多与 GC 相关的选项。

于 2013-04-02T13:04:57.550 回答