Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retained Heap size is more while using jackson ObjectMapper

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.

like image 764
Akalya Avatar asked Dec 19 '14 07:12

Akalya


1 Answers

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.

like image 176
StaxMan Avatar answered Sep 16 '22 15:09

StaxMan