Java 在G1GC中,InitiatingHeapOccupencyPercent设置为40但旧代内存超过60%

Java 在G1GC中,InitiatingHeapOccupencyPercent设置为40但旧代内存超过60%,java,memory-management,g1gc,Java,Memory Management,G1gc,我正试图解决一个问题,在我的java服务中,堆内存超过了90% 下面是我正在使用的堆配置 -Xms6144m \ -Xmx6144m \ -verbose:gc \ -XX:G1HeapRegionSize=2097152 \ -XX:+PrintGC \ -XX:+PrintFlagsFinal \ -XX:In

我正试图解决一个问题,在我的java服务中,堆内存超过了90%

下面是我正在使用的堆配置

-Xms6144m \
                -Xmx6144m \
                -verbose:gc \
               -XX:G1HeapRegionSize=2097152 \
               -XX:+PrintGC \
               -XX:+PrintFlagsFinal \
               -XX:InitiatingHeapOccupancyPercent=40 \
               -XX:NewRatio=2 \
               -XX:+PrintGCDetails \
               -XX:+PrintGCDateStamps \
               -XX:+PrintAdaptiveSizePolicy \
               -XX:+PrintTenuringDistribution \
               -XX:+UseGCLogFileRotation \
               -XX:NumberOfGCLogFiles=10 \
               -XX:GCLogFileSize=50M \
    -XX:+UnlockExperimentalVMOptions \
  -XX:+UseG1GC -XX:+UseStringDeduplication \
  -XX:+UseCGroupMemoryLimitForHeap \
  -XX:+ParallelRefProcEnabled
  -XX:+OptimizeStringConcat
  -XX:MaxRAMFraction=2 \
  -XshowSettings:vm

问题是,我的旧gen逐渐被填满,随着时间的推移,堆在GC之后到达的较低点在增加,我的图看起来像这样:


您能否建议我的堆参数是否正确,它们在配置方式上是否存在冲突,或者如何减少使用的最大堆数?

G1GC的主要目的是通过以下方式保持应用程序的响应性:

试图避免对“旧代”(应用程序保留一段时间的永久对象,如用户会话、缓存或某种内存泄漏)的垃圾收集必须在一个经典的FullGC中完成,其中应用程序被冻结,而整个堆必须清理(这取决于对象的数量,可能需要很长的时间,比如几秒钟。请阅读全部内容,其中一句话:

目标是回收尽可能多的堆空间(从包含最多可回收空间的区域开始)同时尽量不超过暂停时间目标

为:
InitiatingHeapOccupencyPercent
设置的40%与(整个)堆占用率相关,并指示何时启动并发GC循环(如果未看到,则应在日志中可见:).GCs根据整个堆的占用率而不仅仅是其中一代(因此不仅仅是旧代)触发并发GC循环,包括G1,请使用此选项。值0表示“执行常量GC循环”。默认值为45。(改编自:)

因此,有可能:

  • GC循环是在堆占用率达到40%时启动的,但在它完成之前,您会达到一个更高的级别(如90%),只要您的应用程序正常工作,这可能是完全正确的
  • 您存在某种内存泄漏(但在不知道应用程序及其运行时间或更长时间后如何运行的情况下,很难从图表中判断)
  • 可能还有一些其他问题,但如果没有垃圾收集日志进行分析,就无法判断,但您可能希望参考:例如
    疏散故障部分
  • 如果您真的希望应用程序使用更少的内存(可能以性能/吞吐量损失为代价),您可以降低MaxHeapSize(但您应该使用MaxRAMFraction或MaxHeapSize(XmX)中的一种,而不是两者都使用)

    或根据应用程序和性能要求考虑一个完全不同的JVM/垃圾收集器,如:

    • IBM/EclipseOpenJ9(参见:它被吹捧为具有非常低的内存开销)
    • 或者本次Java内存弹性研究中提到的任何其他GC