【问题标题】:Give more CPU time to GC in java?在java中给GC更多的CPU时间?
【发布时间】:2013-03-22 20:01:07
【问题描述】:

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

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

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

非常感谢!

【问题讨论】:

  • “我想确认 XX:CMSIncrementalDutyCycle=60 参数是我正在寻找的东西” - 试试看,启用 GC 日志记录,看看?另外,出于好奇:你在做什么会产生足够多的垃圾,让 60% 的时间花在 GC 上而不是很多?

标签: java optimization garbage-collection


【解决方案1】:

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

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

【讨论】:

  • 实际上 CMSIncrementalDutyCycle 只提供了对它的间​​接控制。唉,我的问题是通过大幅减少年轻一代来解决的。非常感谢。
【解决方案2】:

我想确认 XX:CMSIncrementalDutyCycle=60 参数 是我要找的东西,是否还有其他参数 给 GC 更多的权力(我已经看过 CMSIncrementalPacing 和 CMSIncrementalDutyCycleMin)

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

-XX:CMSIncrementalDutyCycle=<N> default: 50

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

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

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

【讨论】:

  • 好的。那么,除了 GC 运行之外,次要收集之间会发生什么?
  • 您的应用程序执行,jit 编译方法等
  • 您还应该假设 -XX:+CMSIncrementalMode 已启用,这对于“大”框来说不是一个好主意
【解决方案3】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 2012-04-05
    • 2011-11-20
    相关资源
    最近更新 更多