java 内存泄漏的解决_JAVA内存泄漏解决日记

原标题:JAVA内存泄漏解决日记

最近解决了一次线上内存泄漏的BUG,将解决问题的过程记录如下:

1.登录服务器查询JAVA进程heap的概要信息,使用命令:jmap –heap 3772,结果如下图所示:

03153cdf8aae0071da7cedff89704adc.png

从上图可见,老年代已使用99%,这时JVM会不停的GC,GC时会Stop-the-world,当Stop-the-world发生时,除了GC所需的线程以外,所有线程都处于等待状态,直到GC任务完成。如果老年代已使用99%,这时基本大部分时间都在GC,所以应用也就无法正常提供服务。

2.查询JAVA进程每个class的实例数目,使用命令:jmap –histo:live 3772,结果如下图如示:

e45740a60a3cd7c4dd02c0870ef17e2e.png

通过上述命令基本可以定位到实例数目异常的class,定位到异常的class后,有的时候,仅仅通过review源代码,就可以定位到问题所在,但这种情况很少发生,大部分情况都是定位不到问题所在,这时就要查找这些实例的Paths from GC Roots,这样才能定位到这些实例被哪些对象所持有,从而导致的内存泄漏。

我使用的Java profiler工具是yourkit java profiler,操作过程如下,安装及配置yourkit

java profiler的过程暂时不表,这里我只说通过工具如何查找对象的Paths from GC

Roots。

3.点击yourkit java profiler工具栏上Capture Memory Snapshot按钮,会生成JAVA进程heap的一个快照。

a0aca3132dd0e403d907d7f4ee144e98.png

4.选择创建的快照,并点击上面的Memory页签以及ObjectExplorer页签,右键点击下面的实例,就可以查看Paths from GC Roots。

a4583f424ed4745134e3a7e62a14a5c8.png

5.查看对象Paths from GC Roots的界面如下图所示,即可准确定位到内存泄漏的点。

6e5f1ae8174b3f40654a29a014120afa.png

以上仅仅是一个粗略的记录,解决问题的过程其实是花费了整整一天的时间才定位到内存泄漏的点,因为是第一次,很多问题要自己摸索,所以比较慢,如果再遇到类似问题,问题的过程应该会快很多,所以对本次过程也做一个粗略的记录,希望可以给其它同学以启发。感谢@ijava同学的投稿

觉得本文有帮助?请分享给更多人

关注「猿助猿」成就顶级开发

技术交流QQ群:517877452返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值