Sto esaminando una potenziale perdita di memoria (o almeno uno spreco di memoria) in un sistema basato su Java di dimensioni maggiori. La JVM è in esecuzione con una dimensione heap massima di 5 GB e l'utilizzo di heap di 2-3 GB è una linea di base prevista per l'applicazione. (Possono esserci picchi più alti)Ricerca di perdite di memoria Java quando non tutti gli heap utilizzati sono raggiungibili dai thread
In uno scenario di sovraccarico che sto esaminando, l'heap viene riempito. Analizzando un heap-dump con "Eclipse MemoryAnalyzer Tool" viene mostrato (non sorprende) che l'heap sia interamente esaurito.
MAT mostra 2 potenziali candidati alla perdita, entrambi con una tolleranza di 2,5 GB: java.lang.Thread e un oggetto dominio dal sistema che viene ampiamente utilizzato durante l'elaborazione delle transazioni nel sistema. Tuttavia, tutti questi oggetti di dominio sono (non a sorpresa) raggiungibili dalle istanze di Thread. Quei thread stanno elaborando le transazioni, dopo tutto. Pertanto, i 2.5 GB attribuiti a java.lang.Thread sono quasi interamente causati da tali oggetti di dominio. Nessuna sorpresa qui.
Elencare la struttura ad albero di tutte le istanze java.lang.Thread e sommare l'heap mantenuto di tutti i thread risulta in 2,5 GB di heap conservato.
Dove devo cercare gli altri 2,5 GB necessari per riempire l'heap, se non sono raggiungibili da un'istanza di java.lang.Thread? - Non c'è nulla in coda finalizzatore - Non è presente una notevole quantità di oggetti irraggiungibili in attesa GC
Penso che un altro modo per mettere questa domanda è: "Come faccio a trovare tutti gli oggetti che non sono raggiungibili da un'istanza di java.lang.Thread? Forse una query OQL ?, e l'altra domanda: "Che tipo di oggetti ci sono che non sono raggiungibili da un'istanza di java.lang.Thread altro da Oggetti nella coda di Finalizer e oggetti non referenziati in attesa di GC ? "
Ti dispiacerebbe fornire altri dati. Come forse il grafico di cui stai parlando e gli oggetti Dominio stessi. Come sono usati Fanno un grande uso di matrici di dimensioni strane? C'è un'assegnazione che fallisce e provoca il lancio di una OOM? –
Si prega di includere anche se si stanno utilizzando o meno flag GC (come: -XX: + CMSClassUnloadingEnabled -XX: + CMSPermGenSweepingEnabled -XX: + UseConcMarkSweepGC) – JoeG
Sei sicuro che il 2.5 GB del thread includa anche gli oggetti del dominio? Se sono due conteggi separati, allora sarà pari al tuo 5GB. –