点击上方蓝字关注我们
一、生产环境
操作系统:CentOS6.7
JDK版本:jdk1.6.0_45
中间件版本:apache-tomcat-6.0.37
JVM堆内存配置:-Xms8192m-Xmx8192m
二、事件起因
系统前台应用节点告警“URL连接超时”
2.1 使用jstat命令—JVM统计监测工具对堆内存进行分析
jstat -gcutil PID
经过查看,JVM堆内存的年轻代和老年代使用率达到100%
2.2 生成HeapDump文件
Heap Dump是Java进程所使用的内存情况在某一时间的一次快照。以文件的形式持久化到磁盘中。
Heap Dump 获取方式
1、使用 jmap命令生成 dump文件
jmap-dump:live,format=b,file=./log/`hostname`heap.hprof
2、使用 jcmd命令生成 dump文件
jcmd GC.heap_dump app/share/dump/3.39/`date +%Y%m%d%H%M`heap.hprof
3、使用 JVM参数获取 dump文件
-XX:+HeapDumpOnOutOfMemoryError
当OutOfMemoryError发生时自动生成Heap Dump 文件。
本次dump文件为jmap命令手动生成。
2.3 上传至内网分析服务器
ftp -n
open 192.168.xxx.xxx
user username passwd
passive
binary
hash
lcd app/scripts/log #headdump路径
prompt
cd dump #远程服务器路径
mput heap.hprof #headdump文件
close
bye
三、利用MAT检查内存泄漏
3.1、打开MemoryAnalyzer软件,File --> Heap Dump --> next,选择对应的进程,等待MAT加载完成,点击Finish就可以进入MAT分析页面的首页。
3.2、使用MAT的DominatorTree视图,定位到内存溢出源
通过DominatorTree视图可以很容易的找出占用内存最多的几个对象(根据RetainedHeap或Percentage排序)
以下为输出的线程信息:
通过分析我们发现cn.chinatowercom.crm.pub.common.StaticParam.queryStaticParam这个线程为可疑线程。交由开发排查发现该线程为导出时生成,导出数据量较大,从缓存获取的省市区信息,每次只能获取一条,循环翻译导致内存溢出。
END