2014-12-19 88 views
5

正在使用Jackson映射器將我的java對象轉換爲String,但這些對象不會被堆中的GC刪除。使用jackson ObjectMapper時保留的堆大小更多ObjectMapper

我的代碼

List<Object[]> reportList; // This contains my objects 

ObjectMapper map = new ObjectMapper(); // org.codehaus.jackson.map.ObjectMapper 

return map.writeValueAsString(reportList); 

這將返回字符串到我的視圖層,但通過保持在堆對象映射器解析對象。我已經採取了堆轉儲。

Class Name    | Objects | Shallow Heap | Retained Heap 
------------------------------------------------------------------ 
char[]     | 5,03,267 | 5,48,74,336 | >= 54,874,336 
byte[]     | 18,067 | 3,09,01,016 | >= 30,901,016 
java.lang.reflect.Method| 2,60,262 | 2,08,20,960 | >= 32,789,040 
java.util.HashMap$Entry | 4,31,423 | 1,38,05,536 | >= 92,963,752 
java.lang.String  | 4,97,172 | 1,19,32,128 | >= 60,889,416 
------------------------------------------------------------------ 

在看到焦

Class Name               | Shallow Heap | Retained Heap 
----------------------------------------------------------------------------------------------------- 
[2] char[4][] @ 0x72119e690           |   32 |  5,28,352 
'- _charBuffers org.codehaus.jackson.util.BufferRecycler @ 0x72119e658|   24 |  5,28,408 
----------------------------------------------------------------------------------------------------- 
Class Name               | Shallow Heap | Retained Heap 
----------------------------------------------------------------------------------------------------- 
[2] char[4][] @ 0x721158a78           |   32 |  5,28,352 
'- _charBuffers org.codehaus.jackson.util.BufferRecycler @ 0x721158a40|   24 |  5,28,408 
----------------------------------------------------------------------------------------------------- 
Class Name               | Shallow Heap | Retained Heap 
----------------------------------------------------------------------------------------------------- 
[2] char[4][] @ 0x7210bc5e0           |   32 |  5,28,352 
'- _charBuffers org.codehaus.jackson.util.BufferRecycler @ 0x7210bc5a8|   24 |  5,28,408 
----------------------------------------------------------------------------------------------------- 

如何清理從堆這些對象,有沒有清除方法存在。

+0

我使用JProfiller來監視和調查內存問題,我做了一個簡單的測試:我生成了兩個巨大的JSON文件,每個250MB,然後使用ObjectMapper將它轉換爲Java對象。總內存使用量超過500MB,但啓動GC後下降到3.8kB。你啓動了GC還是等了一段時間? GC是否啓動? – 2014-12-19 19:00:04

+0

@llya我還沒有手動啓動GC。我是否需要在我的finally塊中調用System.gc()來清除這些對象? – Akalya 2014-12-22 06:00:35

+0

是的,嘗試調用System.gc()。至少我沒有看到任何內存泄漏,並且在啓動GC之後所有內存都已釋放。 – 2014-12-22 09:03:42

回答

1

您觀察到的內存使用情況是由於緩衝區回收使用每個線程SoftReference來保存幾個解析緩衝區(一個是byte[],另一個是char[])。 如果有內存壓力,這些將被回收;但只要有足夠的堆,它們就會被保留和重用。這可以顯着提高性能,因爲這些緩衝區不需要分配,清除和GC化。

所以它不應該是一個問題 - 這與磁盤緩存類似於操作系統,在內存不足時使用內存塊進行磁盤緩存。

相關問題