2014-12-19 8 views
5

Utilizzo il mapper Jackson per convertire i miei oggetti java in String, ma questi oggetti non vengono rimossi da GC nell'heap.La dimensione heap mantenuta è maggiore durante l'utilizzo di jackson ObjectMapper

Il mio codice

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

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

return map.writeValueAsString(reportList); 

Ciò restituisce String per il mio livello di vista, ma gli oggetti analizzato tramite mapper oggetto conservato nel mucchio. Ho preso la discarica di heap.

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

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

Come pulire questi oggetti dal mucchio, c'è qualche metodo di pulitura esiste.

+0

Sto usando JProfiller per monitorare e analizzare i problemi di memoria e ho fatto un semplice test: ho generato due enormi file JSON da 250 MB ciascuno e poi li converte in oggetti Java usando ObjectMapper. L'utilizzo totale della memoria è stato superiore a 500 MB, ma è sceso a 3,8 kB dopo l'avvio di GC. Hai avviato GC o hai semplicemente aspettato un po 'di tempo? È stato avviato GC? –

+0

@llya non ho avviato manualmente GC. Devo chiamare System.gc() nel mio blocco finally per cancellare questi oggetti? – Akalya

+0

Sì, prova a chiamare System.gc(). Almeno non ho visto perdite di memoria e tutta la memoria è stata rilasciata dopo l'avvio di GC. –

risposta

1

L'utilizzo della memoria osservato è dovuto al riciclo del buffer che utilizza il thread SoftReference per conservare un paio di buffer di analisi (uno uno, un altro char[]). Questi saranno recuperati se c'è pressione di memoria; ma finché c'è molto mucchio, vengono conservati e riutilizzati. Questo può essere un significativo miglioramento delle prestazioni, in quanto tali buffer non devono essere allocati, cancellati e GC.

Quindi non dovrebbe essere un problema - questo è simile alla memorizzazione nella cache del disco che fa il sistema operativo, utilizzando i blocchi di memoria per la cache del disco quando c'è spazio di memoria.