系统频繁full gc问题排查

系统频繁full gc问题排查

fullgc的原因

  • 程序执行了System.gc();
  • 执行了jmap命令;
  • 大对象直接进入了老年代导致老年代内存不足,达到了GC阈值;
  • 程序中存在内存泄露,导致老年代内存缓慢增长,且无法被回收,达到了GC阈值;
  • 老年代存在内存碎片,导致新晋升的对象空间不足,触发gc

gc原因排查

首先需要排查JVM参数配置是否有问题,年轻代和老年代分配比例,是CMS还是G1垃圾回收器。

cms垃圾收集器 会有内存碎片需要压缩整理

-Xms3096m -Xmx3096m -XX:MaxPermSize=256m -Xss256k -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:ParallelGCThreads=4 -XX:ConcGCThreads=2 -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=85
-XX:+DisableExplicitGC -XX:+UseParallelGC -XX:+UseParallelOldGC -Xmn4G -XX:SurvivorRatio=8 -XX:CICompilerCount=[cpu核数 >2 ? cpu核数 : 2]

G1垃圾收集器

-Xms6g -Xmx6g -XX:MaxPermSize=256m -Xss256k -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=2
-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m
-XX:CICompilerCount=[cpu核数 >2 ? cpu核数 : 2]

JVM参数中增加记录gc日志的配置,注意,日志路径必须提前创建好。

-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:./gc.log

将GC日志打包下载,然后去http://gceasy.io官网,将打包好的zip或者gz为后缀的压缩包上传,过一会就会拿到分析结果。可以分析出频繁Full gc的原因。
如果是有大对象或者内存泄露导致内存不足引起的频繁fullgc,可以dump整个堆内存下来进一步分析,可以使用MAT工具进行内存泄露对象分析。

你可能感兴趣的:(系统频繁full gc问题排查)