Java 在G1GC中,InitiatingHeapOccupencyPercent设置为40但旧代内存超过60%
我正试图解决一个问题,在我的java服务中,堆内存超过了90% 下面是我正在使用的堆配置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
-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。(改编自:)
因此,有可能:
疏散故障部分
或根据应用程序和性能要求考虑一个完全不同的JVM/垃圾收集器,如:
- IBM/EclipseOpenJ9(参见:它被吹捧为具有非常低的内存开销)
- 或者本次Java内存弹性研究中提到的任何其他GC