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.
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? –
@llya Ich habe GC manuell nicht initiiert. Muss ich System.gc() in meinem finally-Block aufrufen, um diese Objekte zu löschen? – Akalya
Ja, versuchen Sie, System.gc() aufzurufen. Zumindest habe ich keine Speicherlecks gesehen, und alle Speicher wurden freigegeben, nachdem ich GC gestartet habe. –