java内存泄漏问题排查

      前些日一直在忙性能测试和性能调优,发现性能基本满足要求了,但是出现一个很诡异的问题,我分配给JVM内存10G内存系统能够跑两天,如果分配2个G内存也就跑3个小时,据测试的同事反应在不停的性能测试时系统宕机时间很有规律,而且这个问题持续了有一段时间了,同事也在不停地review代码也没找到蛛丝马迹,正好有时间所以我决定彻底跟踪一下这个问题,经过两天的不断摸索,终于查到原来还是某同事使用MAP时只负责了存数据,而没有释放,从而导致内存泄漏,最终JVM内存被完全耗光,而fullGC在不断尝试时回收不回来任何内存,最终导致系统运行缓慢,内存溢出,从而宕机。

总结一下我的排查步骤:

1、首先我把JVM内存调小,便于在最短的时间内发现问题,利用jstat观察JVM内存回收的情况和使用情况,期间发现旧生代内存的申请在一直进行,但是GC基本回收不回来内存,所以很坚信如果JVM没有BUG的情况下,肯定是存在内存泄漏的地方,应该是代码有问题。但是如何在不翻遍整个代码的情况下,定位问题呢?

2、我查阅几个JVM内存导出工具,并利用JMAP把JVM全部导出来,但是发现悲催的温斗士下,这些工具根本打不开一个G左右的导出文件,直接报乱七八糟的错误,可能也是我的PC硬件配置不高吧,无奈之下只好找了一台LINUX服务器,在其上装了MAT工具,然后把JVM导出文件放到这台服务器上进行分析,结果迅速定位到了存在问题的代码

 

JMAP导出JVM命令格式如下:

jmap -dump:live,format=b,file=heap.bin <pid>

MAT使用比较简单,不再介绍,只要选择打开导出的文件即可对哪些对象、类等对内存的使用情况一目了然,从而帮助把有可能出问题的代码范围尽量缩小,不用像大海捞针一样采用人海战术逐行代码排查。

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值