您的位置:首页 > 编程语言 > Java开发

利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏

2016-08-18 10:34 351 查看
利用Hadoop分析BHO上报日志时,发现很多日志文件会出现下面的错误:

即在map结束的时候抛出Java堆栈溢出异常!(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen 首先设置下面的参数:

发现还是解决不了问题。开始怀疑代码问题,于是进行了一系列的优化:

主要的优化是,在map和reduce程序中,重用key和value对象。但是发现还是解决不了问题。并且mapred.child.java.opts设置3G也无济于事。没有办法,只好继续找原因。最后发现一个规律:报这个异常出错的日志不一定是最大的日志。只好使用最后一招了,直接分析报错时的Java堆内存情况!

再次出现异常的时候,把集群里面所有的机器的Hadoop进程的堆内存导出来分析!主要是下面的几类进程:

同时,关注每台机器的top命令输出,可以从内存的使用情况中发现主要是哪台机器出问题!然后重点导出这台机器的Java堆参数!jmap -dump:live,format=b,file=heapt0923.bin pid

剩下来的就是把/data/bhopid_output/heapt0923.bin这个文件复制到本地,利用Eclipse Memory Analyzer Tool 进行分析!下面是分析的结果:

发现有两个内存泄漏的情况:1、

2、

找到根本原因:说明日志文件有这样很大的空记录导致的!在代码中把这些记录忽略掉即可!

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Eclipse Memory Analy