服务说明:
- JVM参数配置:
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/data-injection-tracking/java_pid%p.hprof -Xloggc:/data/data-injection-tracking/gc.log -XX:+PrintTenuringDistribution -Xms2G -Xmx2G
其中-XX:+HeapDumpOnOutOfMemoryError表示在内存溢出时输出堆Dump文件,文件路径为-XX:HeapDumpPath指定的值。
- 所用Linux JDK版本jdk1.8.0_91
- 所用Linux MAT版本MemoryAnalyzer-1.8.0.20180604-linux.gtk.x86_64.zip(MemoryAnalyzer)
第一步:将堆Dump和MAT文件放到一个Linux目录中
堆Dump文件约2.8G。
image.png
第二步:解压MAT压缩文件
解压后文件夹名为mat
image.png
第三步:追加如下配置到文件./mat/MemoryAnalyzer.ini
内存大小一般需要设置为待分析的Dump文件大小的2倍。
-vmargs
-Xms3096m
-Xmx3096m
-XX:+UseConcMarkSweepGC
-XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled
-XX:+CMSClassUnloadingEnabled
-XX:+UseCMSInitiatingOccupancyOnly
第四步:依次运行如下命令
每个命令都会生成一个压缩文件。
./mat/ParseHeapDump.sh ./java_pid20180702.hprof org.eclipse.mat.api:suspects(内存泄漏报表)
./mat/ParseHeapDump.sh ./java_pid20180702.hprof org.eclipse.mat.api:overview(系统概览报表)
第五步:下载报表压缩文件到本地Windows系统
image.png第六步:解压Leak_Suspect.zip并分析
1) 打开java_pid20180702_Leak_Suspects/index.html,如下图。
2) 点击Details链接
如下图,发现SslCondult对象所占堆内存巨大,从而导致内存溢出。
3)根据Google发现该问题是来至于undertow框架的一个Bug
见:https://issues.jboss.org/browse/WFLY-6380?_sscc=t
4)升级undertow版本到1.4.12可解决此问题
网友评论