2015-07-02 49 views
0

我有一個Java堆轉儲,我正在分析,尋找內存消耗高的用戶。轉儲中超過50%的內存由兩個StringBuffers使用,每個StringBuffers都包含一個char [],它自然地佔各個StringBuffer中的大部分內存。然而,當我在實例查看器中檢查char []時,內容被忽略了,我認爲是因爲字符串非常大。我也嘗試在VisualVM的OQL中使用.toString(),但這顯然只適用於String對象。從Java堆轉儲中查看StringBuffer或char []的內容

有什麼方法可以弄清楚這些數組的內容是什麼?

回答

0

您可以嘗試使用以下OQL編寫所有StringBuffer實例磁盤的內部字符數組的內容:

map(heap.objects('java.lang.StringBuffer'), 
function(it, index) { 
    var writer = new java.io.FileWriter("c:/temp/oql/stringbuffer_0x" + it.id.toString(16) + ".txt"); 
    var chars = it.value; 
    for (var i=0; i<chars.length; i++) { 
    writer.write(chars[i]); 
    } 
    writer.close(); 
})