使用jackson ObjectMapper时保留的堆大小更多

Aka*_*lya 6 java garbage-collection heap-memory jackson

我使用Jackson映射器将我的java对象转换为String,但这些对象不会被堆中的GC删除.

我的代码

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

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

return map.writeValueAsString(reportList);
Run Code Online (Sandbox Code Playgroud)

这会将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
------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

看到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
-----------------------------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)

如何从堆中清除这些对象,是否存在任何清理方法.

Sta*_*Man 2

您观察到的内存使用情况是由于缓冲区回收利用每个线程SoftReference来保留几个解析缓冲区(byte[]一个,另一个char[])。如果存在内存压力,这些将被回收;但只要有足够的堆,它们就会被保留并重用。这可以显着提高性能,因为不需要分配、清除和 GC 此类缓冲区。

所以这应该不是问题——这类似于操作系统所做的磁盘缓存,当有空闲内存时使用内存块进行磁盘缓存。