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

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

  利用Hadoop分析BHO上报日志时,发现很多日志文件会出现下面的错误:

clip_image002

  即在map结束的时候抛出Java堆栈溢出异常!

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen

  首先设置下面的参数:

利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏_第1张图片

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

利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏_第2张图片

主要的优化是,在map和reduce程序中,重用key和value对象。但是发现还是解决不了问题。并且mapred.child.java.opts设置3G也无济于事。

没有办法,只好继续找原因。最后发现一个规律:报这个异常出错的日志不一定是最大的日志。

只好使用最后一招了,直接分析报错时的Java堆内存情况!

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

主要是下面的几类进程:

利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏_第3张图片

同时,关注每台机器的top命令输出,可以从内存的使用情况中发现主要是哪台机器出问题!然后重点导出这台机器的Java堆参数!

jmap -dump:live,format=b,file=heapt0923.bin pid

clip_image010

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

下面是分析的结果:

利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏_第4张图片

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

1、

利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏_第5张图片

2、

利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏_第6张图片

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

利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏_第7张图片

 

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen

你可能感兴趣的:(利用Eclipse Memory Analyzer Tool(MAT)分析内存泄漏)