# 一、分析 Dump的原因

机器宕机或者请求很慢最常出现的几种问题:(针对代码bug或者qps过高造成的)
【1】cpu过高致内存耗尽(OOM),堆区对象回收不过来cpu被打满
【2】死锁抢用资源导致cpu过高致耗尽
【3】内存泄漏:堆内存由于某种原因未释放或无法释放,造成系统内存浪费,严重致宕机(基本上很少)

排查过程(推荐第3种):
【1】arthas诊断工具包:线上诊断程序利器,由于arthas包上传不了不符合现在流程所以采用不了。主要用途在于排查程序jvm问题,包版本与预想不一致问题等。链接
【2】eclipse memory analyzer : 导入dump文件分析,小文件正常分析,一旦文件上G以上,就会出现文件过大问题,就算有方案也是很复杂
【3】采用JProfiler工具排查,下面就着重说下JProfiler

# 二、查看 Classes

前提:从服务器中获取Dump文件

JVM

# 三、查看 Reference

选择一个class或者biggest object

JVM

右键选择Use Selected Objects

JVM

Incoming references:显示这个对象被谁引用。outcoming references:显示这个对象引用的其他对象

JVM

查看

JVM

根据上图查看Graph,能够得到导致OOM的具体代码块

JVM

查看问题代码:当List数量太大时,就会导出OOM

public static void exprotExcel(Map<String, Object> data, List<?> list, RequestData requestData) throws IOException{
    List datas = new ArrayList<>();
    if (Collect.isNotEmpty(list)) {
        for (int i=0; i< list.size(); i++) {
            // 将List转换为Map
            datas.add(BeanToMapUtil.convertBean(list.get(i)));
        }
    }
}
1
2
3
4
5
6
7
8
9

# 四、扩展

【1】生成Dump文件,JVM启动时添加参数:

#出现 OOME 时生成堆 dump: 
-XX:+HeapDumpOnOutOfMemoryError
#生成堆文件地址:
-XX:HeapDumpPath=/home/xxx/logs/
1
2
3
4

【2】Linux tomcat:打开/tomcat_home/bin/catalina.sh文件,其中不设-XX:HeapDumpPath时,dump出的文件在/tomcat_home/bin目录下

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -server -Xms6144m -Xmx6144m -XX:NewSize=384m -XX:MaxNewSize=450m -XX:PermSize=128m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/zyf/logs"
1

【3】linux springboot

nohup java -Xms2048m -Xmx2048m -XX:NewSize=384m -XX:MaxNewSize=450m -XX:PermSize=128m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/darren/logs/ -jar test.jar --spring.profiles.active=prod &
1

【4】windows tomcat:打开/tomcat_home/bin/catalina.bat文件

set JAVA_OPTS=%JAVA_OPTS% -server -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\heapdump
1
(adsbygoogle = window.adsbygoogle || []).push({});