Java内存泄漏快速定位及解决
最近在工作中碰到了内存泄露的问题,导致服务器内存一直在阶梯上升,眼瞅着就要挂掉,只能紧急先重启服务,再慢找原因和解决,作为Java开发常见问题,还是记录一手。
1.内存泄漏原因
在Java中,内存泄漏就是存在一些被分配的对象,首先,这些对象是有被引用的,即在有向树形图中,存在树枝通路可以与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。这些对象不会被GC所回收,然而它却占用内存。
几种常见的内存泄漏:
1.静态集合类,HashMap、Vector、List等集合类,如果设置成静态,
其生命周期和应用程序一致,他们的内部元素也因被引用,无法释放;
2.如果集合里面的对象属性被修改,调用remove()方法将不起作用;
3.各种连接,如数据库,网络等连接,不显式close()的话不会被GC回收;
4.内部类和外部模块的引用,引用后导致无法释放;
5.单例不正确使用,如单例使用外部引用导致其无法释放
2.定位及解决
大体步骤:
1.把Java应用程序使用的heap dump下来
2.使用Java heap分析工具,找出内存占用超出预期(一般是因为数量太多)的嫌疑对象
3.必要时,需要分析嫌疑对象和其他对象的引用关系。
4.查看程序的源代码,找出嫌疑对象数量过多的原因。
dump heap
1.保留现场(让泄漏Java进程运行起来);
2.JAVA_HOME/bin 下运行jmap -dump:format=b,file=/指定路径/heap.bin <pid>
其中:
format=b的含义是,dump出来的文件时二进制格式;
file-heap.bin的含义是,dump出来的文件名是heap.bin;
(这里注意写的路径是否有权限)
<pid>就是JVM的进程号;
3.会在当前目录下生成heap.bin文件,这就是heap dump文件。
打开heap文件
1.下载Eclipse Memory Analyzer分析工具(http://www.eclipse.org/mat/downloads.php);
2.打开heap dump文件(MemoryAnalyzer.ini文件可调内存)。
分析heap文件
这篇文章写的非常详细了(我很懒): https://www.cnblogs.com/trust-freedom/p/6744948.html
原文:http://www.cnblogs.com/yl-saber/p/6907517.html https://blog.csdn.net/bigtree_3721/article/details/50550248 https://www.cnblogs.com/trust-freedom/p/6744948.html