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
-----------------------------------------------------------------------------------------------------
如何清理從堆這些對象,有沒有清除方法存在。
我使用JProfiller來監視和調查內存問題,我做了一個簡單的測試:我生成了兩個巨大的JSON文件,每個250MB,然後使用ObjectMapper將它轉換爲Java對象。總內存使用量超過500MB,但啓動GC後下降到3.8kB。你啓動了GC還是等了一段時間? GC是否啓動? – 2014-12-19 19:00:04
@llya我還沒有手動啓動GC。我是否需要在我的finally塊中調用System.gc()來清除這些對象? – Akalya 2014-12-22 06:00:35
是的,嘗試調用System.gc()。至少我沒有看到任何內存泄漏,並且在啓動GC之後所有內存都已釋放。 – 2014-12-22 09:03:42