2014-02-27 64 views
0

繼一個OutOfMemoryError予處理通過IBM Support Assistant的64位存儲器分析器所得heapdumpsStringBuffer的炭[]似乎是出界在堆轉儲

若干泄漏候選人列出((J9 VM上的Websphere 7.0.23運行)所有系統類加載器都相關),但其中的一個似乎表明在StringBuffer中用值爲256初始化的char []實際上包含7700萬個空字符。

從支持助理所得堆轉儲分析顯示一個char [77418987] @ 0xc32 * * * \ u0000的\ u0000的\ u0000的.......

這通過引用的StringBuffer - >的PatternLayout - > TimeAndSizeRollingAppender

保留的堆檢出,每個char有2個字節,數組本身爲18個,總共爲150+ Mbs。

Log4j版本是1.2.16,我們使用了同步TimeAndSizeRollingAppender(儘管我想刪除這個依賴關係)。

這可能是來自Support Assistant的誤報,或者是否有某種方式可以使char [256]成爲堆上的char [77000000+]?

+1

」實際上包含7700萬個空對象「 - 不,它包含7700萬U + 0000個字符。沒有「空對象」這樣的東西。在使用術語時應該精確。這聽起來像是在創建'StringBuffer'的任何錯誤 - 你能鏈接到相關的代碼嗎? –

+0

已修改。這裏的屏幕截圖http://s1026.photobucket.com/user/Spinflight/media/charstackoverflow_zpsa176f1f5.png.html – Chaffers

+0

StringBuffer似乎是由log4j PatternLayout.java創建的。 – Chaffers

回答

1

默認情況下,WebSphere生成PHD文件以響應OOM事件。你需要注意的一件事是這些轉儲包含有關堆中對象及其引用的信息,但不包括存儲在屬性和數組(原始類型)中的實際數據。這就是爲什麼內存分析儀只顯示零。要獲得有關根本原因的更多信息,您應該配置您的WebSphere以創建系統轉儲。這將允許您查看數組中的數據,並且應該爲您提供有關正在發生的事情的提示。

下面的鏈接解釋如何做到這一點:

http://pic.dhe.ibm.com/infocenter/isa/v4r1m0/topic/com.ibm.java.diagnostics.memory.analyzer.doc/producing.html

對於256與77000000+問題:256只StringBuffer的初始容量。當數據被追加時,它會根據需要自動增長。 「

+0

謝謝安德烈斯,這解釋了空值。至於問題本身,對常用的StringBuffer類的完全誤解,以及它害怕的是什麼。 – Chaffers