文档章节

JVM内存泄漏分析

孤鹜壑拽
 孤鹜壑拽
发布于 2015/08/26 10:28
字数 1158
阅读 107
收藏 0

Top:

  f或者F 从当前显示中添加或者删除项目。
  o或者O 改变显示项目的顺序。
  l 切换显示平均负载和启动时间信息。
  m 切换显示内存信息。
  t 切换显示进程和CPU状态信息。
  c 切换显示命令名称和完整命令行。
  M 根据驻留内存大小进行排序。
  P 根据CPU使用百分比大小进行排序。
  T 根据时间/累计时间进行排序。

1、使用top命令,然后按c键,根据command的详细信息找出对应的java进程PID(ps、jps等方法也是OK的,方法可谓五花八门了),这里是2965;

2、top -p 2965,然后再按H(H是显示当前进程中的各线程),找到占cpu为100%左右的某线程(线程的PID为:2970)

3、将2970转16进制:B9A(快捷键win+r-->输入calc-->使用程序员计算器)

4、使用jstack -l 2965 | grep B9A找到当前线程,结果是:"Concurrent Mark-Sweep GC Thread" prio=10 tid=0x0000000053293800 nid=0x*** runnable 

5、而Concurrent Mark-Sweep GC Thread,是JVM的标记清除线程,可见GC太频繁,由于JVM中根据对象的存活周期的不同将内存划分为几块。把java堆分为新生代和老年代,根据各个年代的特点采用适当的收集算法。在新生代,每次垃圾收集时都发现有大批对象死去,只有少量幸存者,选用复制算法从from区到to区,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、并没有额外空间对他进行分配担保,就使用“标记-整理”算法进行回收,本次的内存漏问题主要发生在老龄代。

6、为了确定一下以上推测,再使用 jmap -heap 2965(注意:jmap不是运行分析工具,在生成结果时JVM可能会挂起,因此当生成统计结果时需要确认这种暂停对程序是可接受的,查看得老龄区占用内存已达99.99%(而老龄区的内存设置为: capacity = 2147483648 (2048.0MB));使用jmap -dump:format=b,file=dump.65 2965将内存dump成文件,将内存文件拿下来分析;

(可以不拿下来,直同样直接可以在服务器上使用jhat对dump文件分析,jhat默认会打开7000端口的web服务;并具如果dump文件过大,jhat需要使用的xmx参数也需要注意设置,否则OOM;jhat -J-mx4G -port 8080 D:\klive\midea\wspace\document\data\dump.65,但注意端口是否开放,是否冲突,机器是否够内存,详细分析过程不写了)

为了使结果更明显借用第三方工具:

7、下载memory analyzer tool工具进行dump文件分析,由于本人使的是intelij idea,而这个idea没有相对应的MAT插件,就懒得下载mat对应的eclipse的插件而是下载具有能独立运行的mat版本,具体地址是http://www.eclipse.org/mat/downloads.php,具体的eclipse插件可参考:http://blog.csdn.net/yanghongchang_/article/details/7711911

8、由于dump下来的文件大约3.2G,而想下载到工作的电脑上,这个是文件是大了点,使用tar -czf dum.tar.gz dump.65命令进行压缩,(加z是tar调用gzip进行压缩),具体的压缩命令,请参考:http://www.jb51.net/LINUXjishu/43356.html结果为600多M,虽然还很大,但却小了很多。

9、由于dump文件过大,所要以需要修改MAT启动的xmx参数:到mat安装的根目录下找到:MemoryAnalyzer.ini,修改-Xmx的值4096m;

10、启动mat,加载dump文件进行结果分析,不看不知道,一看挺恐怖javax.crypto.SunJCE_b这个类竟然占了2.1G内存;

结果一目了然:

org.bouncycastle.jce.provider.BouncyCastleProvider()的实例,一直回收不了,快撑爆了2G的老龄区;

后来分析知道的这个是用户解密的代码问题。检查common包的RSAUtil类,结果也是一目了然,这代码估计也是copy网上的然后没仔细检查一下,二话没说地使用了。

总结:这问题告诉我们这种结果不是我们想要;

备注:更详细的MAT分析:http://seanhe.iteye.com/blog/898277


© 著作权归作者所有

共有 人打赏支持
孤鹜壑拽
粉丝 1
博文 1
码字总数 1158
作品 0
广州
线上应用故障排查之二:高内存占用

搞Java开发的,经常会碰到下面两种异常: 1、java.lang.OutOfMemoryError: PermGen space 2、java.lang.OutOfMemoryError: Java heap space 要详细解释这两种异常,需要简单重提下Java内存模...

MZHS
2015/11/13
0
0
Java线上应用故障排查之二:高内存占用

前一篇介绍了线上应用故障排查之一:高CPU占用,这篇主要分析高内存占用故障的排查。 搞Java开发的,经常会碰到下面两种异常: 1、java.lang.OutOfMemoryError: PermGen space 2、java.lang...

Kerry_Han
2014/10/27
0
0
java.lang.OutOfMemoryError: Java heap space

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 今天我想说说这个有趣的问题,这的确是个让人费解的是error 问题来源: 这个问题一般会出在myecplise 和ecplise ,...

soul_mate
2014/05/03
0
0
升级到JDK9的一个BUG,你了解吗

概述 前几天在一个群里看到一个朋友发了一个demo,说是JDK的bug,昨天在JVM的一个群里又有朋友发了,觉得挺有意思,分享给大家,希望大家升级JDK的版本的时候注意下是否存在这样的代码,如果...

你假笨
06/06
0
0
Java内存溢出(OOM)异常完全指南

这也许是目前最为完整的Java OOM异常的解决指南。 1、 Java应用程序在启动时会指定所需要的内存大小,它被分割成两个不同的区域:和: JVM内存模型示意图 这两个区域的大小可以在JVM(Java虚...

大数据之路
2012/12/31
0
3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
0
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
21
5
centos7安装redis及开机启动

配置编译环境: sudo yum install gcc-c++ 下载源码: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 解压源码: tar -zxvf redis-3.2.8.tar.gz 进入到解压目录: cd redis-3......

hotsmile
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部