【问题标题】:Major GC not running in G1主要 GC 未在 G1 中运行
【发布时间】:2020-01-19 08:14:04
【问题描述】:

在分析应用程序的性能问题后,注意到以下几点。

  • JVM 使用 G1 GC
  • 在高峰时段,JVM 暂停超过 20%
  • 对于 Eden Space - 每分钟 GC 计数为 20,每分钟 GC 时间为 10 秒(不是毫秒)
  • 对于老一代空间 - 没有 GC 运行。它稳步上升,但也随机出现一些下降(令人惊讶)。
  • 垃圾收集的 CPU 使用率约为 7%,而应用程序约为 30%(包括后台和 Web 请求)

我试图收集有关 G1 的更多详细信息,但仍有一些问题没有得到解答。如果可以的话,请帮忙。

  1. 如果我们使用 G1,是否存在次要、主要或完整 GC?如果没有这样的分类,为什么不为 Old Gen 运行 GC? Documentation 无法确定这一点。
  2. 即使没有为 Old Gen 运行 GC,如何释放内存,即使它是一点点? (例如,已用内存从 16GB 减少到 15GB,然后再次增加到 16GB)

【问题讨论】:

    标签: java garbage-collection g1gc


    【解决方案1】:

    关于你的第一个问题。 G1 垃圾收集器实现背后的想法是最小化甚至避免执行完整或主要垃圾收集,因为这是一个停止世界事件,其复杂性会产生更长的暂停和 CPU 消耗。即使当我使用吞吐量 GC 时,我也总是试图减少完整垃圾回收的数量,所以我想说,你的系统在不执行完整 GC 的情况下运行真的很好。

    此外,请记住,如果您使用的 JDK 版本低于 10,则使用 G1 执行 Full GC 将只使用一个线程,正如我在这篇文章中指出的那样。

    Java 7 G1GC strange behaviour

    顺便说一句,Java (10) 的最新版本似乎将包含一个能够并行执行 Full GC 的 G1。

    关于你的第二个问题。使用次要 GC 清理内存,这就是为什么您可以看到堆消耗减少的原因。

    在本文档中,您可以找到关于 G1 的详细说明。

    http://blog.sysco.no/files/guides/JVMGarbageCollectionV1.1.pdf

    老兄

    【讨论】:

    • 您对第一个问题的回答。 “G1 垃圾收集器实现背后的想法是尽量减少甚至避免执行完整或主要垃圾收集,因为这是一个停止世界事件,其复杂性会产生更长的暂停和 CPU 消耗。”。有没有这样说的文件?回答第二个问题。在第三个项目符号中,我观察到老一代记忆力下降。我没有说“堆”。如果 old gen GC 没有运行,为什么 old gen 内存会减少?
    • 您能提供您的 GC 日志吗?
    【解决方案2】:

    我提供了文档,其中解释了 G1 使用称为混合集合的东西。

    http://blog.sysco.no/files/guides/JVMGarbageCollectionV1.1.pdf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-15
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多