美文网首页
一次内存溢出问题的查找过程

一次内存溢出问题的查找过程

作者: 文竹小二 | 来源:发表于2018-07-04 16:49 被阅读105次

    服务说明:

    • 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,如下图。

    image.png

    2) 点击Details链接
    如下图,发现SslCondult对象所占堆内存巨大,从而导致内存溢出。

    image.png

    3)根据Google发现该问题是来至于undertow框架的一个Bug
    见:https://issues.jboss.org/browse/WFLY-6380?_sscc=t

    4)升级undertow版本到1.4.12可解决此问题

    相关文章

      网友评论

          本文标题:一次内存溢出问题的查找过程

          本文链接:https://www.haomeiwen.com/subject/aoueuftx.html