利用Hadoop分析BHO上報日志時,發現很多日志文件會出現下面的錯誤:

即在map結束的時候拋出Java堆棧溢出異常!
(友情提示:本博文章歡迎轉載,但請注明出處:hankchen,http://www.tkk7.com/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、

找到根本原因:說明日志文件有這樣很大的空記錄導致的!在代碼中把這些記錄忽略掉即可!
![clip_image002[11] clip_image002[11]](http://www.tkk7.com/images/blogjava_net/hankchen/WindowsLiveWriter/EclipseMemoryAnalyzerToolMAT_FC20/clip_image002%5B11%5D_thumb.jpg)
(友情提示:本博文章歡迎轉載,但請注明出處:hankchen,http://www.tkk7.com/hankchen)