# 一、分析 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](../../assets/img/class.238be82e.png)
# 三、查看 Reference
选择一个class
或者biggest object
![JVM](../../assets/img/big.df258531.png)
右键选择Use Selected Objects
![JVM](../../assets/img/selected.0d1c9e56.png)
Incoming references
:显示这个对象被谁引用。outcoming references
:显示这个对象引用的其他对象
![JVM](../../assets/img/ref.72f69861.png)
查看
![JVM](../../assets/img/show.b79d868e.png)
根据上图查看Graph
,能够得到导致OOM
的具体代码块
![JVM](../../assets/img/graph.24b5e659.png)
查看问题代码:当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
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
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