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

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

 

 

你可能感兴趣的:(java内存泄漏问题排查)