【问题标题】:CG start to collecting garbage too earlyCG太早开始收集垃圾
【发布时间】:2019-05-16 19:30:38
【问题描述】:

我有 6g 的堆,而 gc 总是以 ~4.5g 的堆负载开始工作。 现在我设置 -Xmx20g(20 GB 堆大小)和 -Xms16g(初始堆大小为 16 GB),但和以前一样,GC 在 ~4.5g 内存处激活。 为什么以及如何强制 gc 使用所有这些内存? GC是标准的。爪哇 8。

【问题讨论】:

  • 你能分享年轻一代和老一代的实际大小吗?似乎您经历了年轻一代的收集,尽管尚不清楚为什么在将堆空间从 6GB 增加到 20GB 后“阈值”没有改变(特别是如果您没有明确设置年轻一代的大小)。另外,您使用哪种 GC?
  • 最好实际查看 GC 日志并在此处分享相关部分。
  • 让我问你这个 - 1) 为什么你关心这个? 2) 为什么,以及如何强制 gc 使用所有这些内存 - 这是什么意思?
  • 年轻一代很可能是 ~4.5 GB。尝试添加-Xmn16g,尽管这可能不适合您的应用程序。

标签: garbage-collection jvm heap-memory


【解决方案1】:

也许您应该尝试使用 -Xms20G 和 -Xmx20G 来避免调整大小。重要的是,每次调整 JVM 大小时都会执行一次完整 GC,因此避免此过程是最小化完整垃圾回收次数的好方法。

请阅读本文

"当 Hotspot JVM 启动时,堆、年轻代和永久代空间被分配到它们的初始大小,分别由 -Xms、-XX:NewSize 和 -XX:PermSize 参数确定,并递增为-需要到最大保留大小,它们是 -Xmx、-XX:MaxNewSize 和 -XX:MaxPermSize。如果内存不需要像最初指定的那么多,JVM 也可能会在运行时缩小实际大小。但是,每次调整大小活动触发完整垃圾收集 (GC),因此会影响性能。作为最佳实践,我们建议您使初始大小和最大大小相同”

来源:http://www.oracle.com/us/products/applications/aia-11g-performance-tuning-1915233.pdf

如果你能提供你的 gc.log,彻底分析这个案例会很有用。

最好的问候,RCC

【讨论】:

    【解决方案2】:

    真的!问题出在伊甸园空间。它在 -Xms16g 上自动设置为 6Gb。 我分析我的应用程序的长寿命对象的大小较小,因此我将 edem 调整为 16g,将最大堆调整为 20g,并且 GC 激活的频率较低。

    【讨论】:

      猜你喜欢
      • 2011-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      相关资源
      最近更新 更多