java内存泄漏Dump分析
2018-01-27 14:54
120 查看
内存泄漏是造成内存溢出的主要原因之一,在程序中当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致它不能被回收,本该被回收的对象不能被回收而停留在堆内存中,就产生了内存泄漏。
简单记录下内存泄漏的分析步骤:(不对的望指正)
实例分析:
第一步:查看cpu最高的进程id
注:假设cpu最高的进程id为 java_pid
top -c
14151
第二步:查看进程所有线程的资源消耗情况,找到cpu负载高的线程id
注:假设cpu负载高的线程id为 thread_pid
top -H -p java_pid
top -H -p 14151
14153
第三步:查看当前java进程的堆栈信息,生成thread_dump文件
隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x246c的线程调用栈中,
发现该线程一直在执行JstackCase类第33行的calculate方法,得到这个信息,就可以检查对应的代码是否有问题。
jstack java_pid > dump_thread.log
jstack 14151 > dump_thread.log
第四步:将cpu负载高的线程id转成16进制的值
注:在thread dump中每个线程都有一个nid,找到对应的nid即可;
printf "%x\n" thread_pid
printf "%x\n" 14153
3749
基本执行过程:
第一步:获取Java进程pid(以及传递给JVM的参数)
jps -v
ps -ef | grep demo-web
第二步:打印java进程的堆空间概要(可以粗略的检验heap空间的使用情况。)
jmap -heap 12814
第三步:生成heap dump文件
jmap -dump:format=b,file=dump_heap.log 12814
第四步:生成heap live dump文件
jmap -dump:live,format=b,file=dump_heap_live.log 12814
第五步:生成thread dump文件
jstack pid >dump_thread.log
使用top -H -p 进程号查看异常线程
top -H -p 12814
找到cpu负载高的线程id,把这个数字转换成16进制
使用printf "%x\n" 线程号将异常线程号转化为16进制
printf "%x\n" 线程id
30c9
jstack pid|grep 30c9 -A90
第六步:使用 Eclipse Memory Analyzer(MAT) 进行堆转储文件分析
启动MAT,选择菜单项 File- Open Heap Dump 来加载需要分析的堆转储文件
Overview中查看Histogram和Leak Suspects面板
具体问题具体分析
简单记录下内存泄漏的分析步骤:(不对的望指正)
实例分析:
第一步:查看cpu最高的进程id
注:假设cpu最高的进程id为 java_pid
top -c
14151
第二步:查看进程所有线程的资源消耗情况,找到cpu负载高的线程id
注:假设cpu负载高的线程id为 thread_pid
top -H -p java_pid
top -H -p 14151
14153
第三步:查看当前java进程的堆栈信息,生成thread_dump文件
隔段时间再执行一次stack命令获取thread dump,区分两份dump是否有差别,在nid=0x246c的线程调用栈中,
发现该线程一直在执行JstackCase类第33行的calculate方法,得到这个信息,就可以检查对应的代码是否有问题。
jstack java_pid > dump_thread.log
jstack 14151 > dump_thread.log
第四步:将cpu负载高的线程id转成16进制的值
注:在thread dump中每个线程都有一个nid,找到对应的nid即可;
printf "%x\n" thread_pid
printf "%x\n" 14153
3749
基本执行过程:
第一步:获取Java进程pid(以及传递给JVM的参数)
jps -v
ps -ef | grep demo-web
第二步:打印java进程的堆空间概要(可以粗略的检验heap空间的使用情况。)
jmap -heap 12814
第三步:生成heap dump文件
jmap -dump:format=b,file=dump_heap.log 12814
第四步:生成heap live dump文件
jmap -dump:live,format=b,file=dump_heap_live.log 12814
第五步:生成thread dump文件
jstack pid >dump_thread.log
使用top -H -p 进程号查看异常线程
top -H -p 12814
找到cpu负载高的线程id,把这个数字转换成16进制
使用printf "%x\n" 线程号将异常线程号转化为16进制
printf "%x\n" 线程id
30c9
jstack pid|grep 30c9 -A90
第六步:使用 Eclipse Memory Analyzer(MAT) 进行堆转储文件分析
启动MAT,选择菜单项 File- Open Heap Dump 来加载需要分析的堆转储文件
Overview中查看Histogram和Leak Suspects面板
具体问题具体分析
相关文章推荐
- java的源码分析 list
- [从头学数学] 第147节 数据的分析 小结与复习题
- Python中绑定与未绑定的类方法用法分析
- 花椒用户体验分析|在非生即死的红海中偷偷转型
- C语言建立单链表出错误及其分析
- 时间序列模型中,哪一个模型可以较好地拟合波动性的分析和预测
- java对象的比较分析
- 2nd 四人小组项目的进一步分析
- Fragment生命周期及add、replace、remove、hide&show方法分析
- SQL Injection with MySQL 注入分析
- wav文件格式分析详解
- 深入分析AsyncTask
- Python数据分析相关库
- 时间分析会用到的函数
- 洛谷 P2194 HXY烧情侣【Tarjan缩点】 分析+题解代码
- 分布式事务 TCC-Transaction 源码分析 —— TCC 实现
- 第6课 - 内联函数分析
- oracle分析函数Ratio_to_report使用说明
- Thread Dump分析(转)
- 用数据来分析网站SEO结果