您的位置:首页 > 其它

内存泄露排查

2015-03-26 19:19 148 查看
通过jmap命令获得运行中的jvm的堆快照,那么想利于该工具进行分析第一步仍然是获得堆转储文件。具体命令如下:

jmap-dump:format=b,file=jmap.hprof 32460

注意,32460为java进程pid值,另外本分析工具支持的文件扩展名为hprof,所以将输出文件名定为hprof,有了这个文件我们就可以通过本工具来分析他。

启动Eclipse Memory Analyzer,是不是和eclipse开发平台非常类似?其实他还可做为eclipse的插件进行集成,在这就不详细介绍了,有兴趣的可以自己研究一下。

选择菜单File-Open HeadDump然后选择我们生成的堆转储文件

打开后他提示是否自动生成泄露检测报告,我们选择后,点finish完成

预防和检测内存漏洞

在了解了引起内存泄漏的一些原因后,应该尽可能地避免和发现内存泄漏。

(1)好的编码习惯。最基本的建议就是尽早释放无用对象的引用,大多数程序员在使用临时变量的时候,都是让引用变量在退出活动域后,自动设置为null。在使用这种方式时候,必须特别注意一些复杂的对象图,例如数组、列、树、图等,这些对象之间有相互引用关系较为复杂。对于这类对象,GC 回收它们一般效率较低。如果程序允许,尽早将不用的引用对象赋为null。另外建议几点:

在确认一个对象无用后,将其所有引用显式的置为null;

当对象是一个Thread 的时候,删除该对象之前不妨调用它的interrupt()方法;内存检测过程中不仅要关注自己编写的类对象,同时也要关注一些基本类型的对象,例如:int[]、String、char[]等等;如果有数据库连接,使用try…finally 结构,在finally 中关闭Statement 对象和连接。

(2)好的测试工具。在开发中不能完全避免内存泄漏,关键要在发现有内存泄漏的时候能用好的测试工具迅速定位问题的所在。市场上已有几种专业检查Java 内存泄漏的工具,它们的基本工作原理大同小异,都是通过监测Java 程序运行时,所有对象的申请、释放等动作,将内存管理的所有信息进行统计、分析、可视化。开发人员将根据这些信息判断程序是否有内存泄漏问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: