使用Jackson mapper将我的java对象转换为String,但这些对象不会被堆中的GC删除。
我的代码
List<Object[]> reportList; // This contains my objects
ObjectMapper map = new ObjectMapper(); // org.codehaus.jackson.map.ObjectMapper
return map.writeValueAsString(reportList);
这会将String返回到我的视图层,但是通过保留在堆中的对象映射器解析对象。我已经进行了堆转储。
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
------------------------------------------------------------------
看到char
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 :(得分:1)
您观察到的内存使用是由于缓冲区回收使用每个线程SoftReference
来保留一对解析缓冲区(一个byte[]
,另一个char[]
)。
如果有记忆压力,这些将被收回;但只要有足够的堆,它们就会被保留并重用。这可以显着提高性能,因为这样的缓冲区不需要分配,清除和GC。
所以这不应该是一个问题 - 这类似于操作系统所做的磁盘缓存,当存在备用内存时,使用内存块进行磁盘缓存。