Am using Jackson mapper to convert my java objects to String, But these objects are not removed by GC in heap.
My code
List<Object[]> reportList; // This contains my objects
ObjectMapper map = new ObjectMapper(); // org.codehaus.jackson.map.ObjectMapper
return map.writeValueAsString(reportList);
This returns String to my view layer, But Objects parsed via object mapper retained in heap. I have taken heap dump.
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
------------------------------------------------------------------
While seeing 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
-----------------------------------------------------------------------------------------------------
How to clean these objects from heap, is there any cleanup method exist.
Memory usage you observe is due to buffer recycling that uses per-thread SoftReference
to hold on to couple of parsing buffers (a byte[]
one, another char[]
) one.
These will be reclaimed if there is memory pressure; but as long as there is plenty of heap, they are retained and reused. This can be significant performance improvement, as such buffers need not be allocated, cleared, and GC'ed.
So it should not be a problem -- this is similar to disk caching that OS does, using memory blocks for disk cache when there is memory to spare.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With