Java 主要GC未在G1中运行

Java 主要GC未在G1中运行,java,garbage-collection,g1gc,Java,Garbage Collection,G1gc,在分析应用程序的性能问题后,注意到以下几点 JVM使用G1 GC 在高峰时段,JVM暂停超过20% 对于伊甸园空间-每分钟GC计数为20,每分钟GC时间为10秒(不是毫秒) 对于旧的Gen空间-没有运行GC。它稳步上升,但也随机出现一些下降(令人惊讶) 垃圾收集的CPU使用率约为7%,而应用程序的CPU使用率约为30%(包括后台和web请求) 我试图收集更多关于G1的细节,但仍然有一些问题没有回答。如果可以的话,请帮忙 如果我们使用G1,是否有次要、主要或完全GC?如果没有这样的分类,为什么

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

  • JVM使用G1 GC
  • 在高峰时段,JVM暂停超过20%
  • 对于伊甸园空间-每分钟GC计数为20,每分钟GC时间为10秒(不是毫秒)
  • 对于旧的Gen空间-没有运行GC。它稳步上升,但也随机出现一些下降(令人惊讶)
  • 垃圾收集的CPU使用率约为7%,而应用程序的CPU使用率约为30%(包括后台和web请求)
我试图收集更多关于G1的细节,但仍然有一些问题没有回答。如果可以的话,请帮忙

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

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

    此外,请记住,如果您使用的是低于版本10的JDK,那么使用G1执行完整GC将只使用一个线程,正如我在本文中指出的那样

    顺便说一句,Java(10)的最新版本似乎将包括一个G1,它具有并行执行完整GCs的能力

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

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


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

    此外,请记住,如果您使用的是低于版本10的JDK,那么使用G1执行完整GC将只使用一个线程,正如我在本文中指出的那样

    顺便说一句,Java(10)的最新版本似乎将包括一个G1,它具有并行执行完整GCs的能力

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

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


    Dude

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


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


    您对第一个问题的回答。”作为G1,垃圾收集器实现背后的想法是最小化甚至避免执行完整或主要垃圾收集,因为这是一个停止世界事件,其复杂性会导致更长的暂停和CPU消耗。”。有没有这样的文件?第二个问题的答案。在第三个项目中,我观察到旧的Gen内存减少。我没说“堆”。若老一代GC并没有运行,为什么老一代内存会减少?你们能提供你们的GC日志吗?你们对第一个问题的答案作为G1,垃圾收集器实现背后的想法是最小化甚至避免执行完整或主要垃圾收集,因为这是一个停止世界事件,其复杂性会导致更长的暂停和CPU消耗。”。有没有这样的文件?第二个问题的答案。在第三个项目中,我观察到旧的Gen内存减少。我没说“堆”。如果老一代GC没有运行,为什么老一代内存会减少?您能提供您的GC日志吗?