2014-12-19 5 views
5

Verwenden Sie Jackson Mapper, um meine Java-Objekte in String zu konvertieren, aber diese Objekte werden nicht von GC in Heap entfernt.Retained Heap Größe ist mehr bei der Verwendung von Jackson ObjectMapper

Mein Code

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

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

return map.writeValueAsString(reportList); 

Dieser String meiner Ansicht Schicht zurückgibt, aber Objekte über Objekt Mapper analysiert im Heap beibehalten. Ich habe Heap Dump genommen.

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 
------------------------------------------------------------------ 

Während char sieht

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 
----------------------------------------------------------------------------------------------------- 

Wie diese Objekte aus Haufen reinigen, gibt es ein Bereinigungsverfahren existieren.

+0

Ich verwende JProfiller, um Speicherprobleme zu überwachen und zu untersuchen, und ich habe einen einfachen Test gemacht: Ich habe zwei riesige JSON-Dateien mit jeweils 250 MB generiert und dann mit ObjectMapper in die Java-Objekte konvertiert. Die Gesamtspeicherauslastung betrug mehr als 500 MB, aber nach dem Start von GC ging sie auf 3,8 KB zurück. Hast du GC initiiert oder hast du nur eine Weile gewartet? Wurde GC initiiert? –

+0

@llya Ich habe GC manuell nicht initiiert. Muss ich System.gc() in meinem finally-Block aufrufen, um diese Objekte zu löschen? – Akalya

+0

Ja, versuchen Sie, System.gc() aufzurufen. Zumindest habe ich keine Speicherlecks gesehen, und alle Speicher wurden freigegeben, nachdem ich GC gestartet habe. –

Antwort

1

Speichernutzung Sie beobachten, ist durch das Recycling puffern, die pro-Thread verwendet SoftReference zu einigen Parsing Puffer zu halten (ein byte[] ein, eine andere char[]) ein. Diese werden zurückgewonnen, wenn Speicherdruck vorhanden ist; Aber solange es genug Haufen gibt, werden sie behalten und wiederverwendet. Dies kann eine erhebliche Leistungsverbesserung sein, da solche Puffer nicht zugewiesen, gecleart und GC'ed sein müssen.

Also sollte es kein Problem sein - das ist vergleichbar mit Festplatten-Caching, das OS tut, mit Speicherblöcken für den Festplatten-Cache, wenn Speicher übrig ist.

Verwandte Themen