我有一个使用尽可能多的CPU的java应用程序,并且有很多内存(高达80Gb)。
我正在针对该应用优化GC,我想告诉JVM使用给定时间百分比(60%)到GC,否则机器不在GC中处理和分配更多内存的时间
我想确认-XX:CMSIncrementalDutyCycle=60
参数是我正在寻找的东西,以及是否有任何其他参数可以为GC提供更多功能(我已经看过CMSIncrementalPacing
和CMSIncrementalDutyCycleMin
)
非常感谢!
答案 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。