一、背景说明
伴随着JDK版本不断攀升,已逐步将项目中JDK由1.7升级到1.8,偶然发现G1 GC相比CMS加入了一些新特性,像并行独占式运算,指定停顿目标时间,减少空间碎片等。最终决定将项目中使用的CMS升级为G1,在升级过程中遇到RSS内存泄漏问题。
二、问题说明
在将项目的GC升级为G1后,yong GC可正常执行,各项指标正常,但是java进程的RSS随着时间的推移持续增长,具体G1 的JVM配置如下所示:(4核CPU,8G内存Docker)
-Xmx6g -Xms6g -XX:+UseG1GC -XX:G1HeapRegionSize=32m -XX:G1HeapWastePercent=5 -XX:MaxGCPauseMillis=500 -XX:G1MaxNewSizePercent=65 -XX:InitiatingHeapOccupancyPercent=20 -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 -XX:G1MixedGCLiveThresholdPercent=60 -Dfile.encoding=UTF-8 -XX:+UseStringDeduplication -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintAdaptiveSizePolicy -Xloggc:/export/Logs/gc.log
RSS:Resident Set Size (常驻内存集) 表示的是linux中该进程实际使用物理内存大小,其中RSS=使用堆内存+使用栈内存+共享库中内存。
三、问题排查
1)由于项目特点导致以上G1配置在项目中使用并不会触发Full GC或者Mixed GC,大部分对象都未挺过young GC,仅有很少一部分会升级到老年代,具体GC日志如下所示: