在java中为GC提供更多的CPU时间?

时间:2013-04-01 17:52:02

标签: java optimization garbage-collection

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

我正在针对该应用优化GC,我想告诉JVM使用给定时间百分比(60%)到GC,否则机器不在GC中处理和分配更多内存的时间

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

非常感谢!

3 个答案:

答案 0 :(得分:1)

  

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

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

-XX:CMSIncrementalDutyCycle=<N> default: 50
  

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

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

没有标志允许您直接控制GC线程执行的时间。

答案 1 :(得分:1)

无法为GC集合中的CPU使用率设置 上限

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

答案 2 :(得分:1)

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

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

  • -XX:ParallelGCThreads=N设置了世界各地的核心数量
  • -XX:ConcGCThreads=N设置并发任务的核心数(仅适用于CMS)

您可以找到更多与GC相关的选项here