Per anni, abbiamo eseguito servizi Java con dimensioni heap ridotte utilizzando +UseParallelOldGC
. Ora stiamo iniziando a implementare un nuovo servizio utilizzando un heap più grande e il collector G1. Questo sta andando abbastanza bene.Java G1: monitoraggio perdite di memoria in produzione
Per i nostri servizi che utilizzano +UseParallelOldGC
, monitoriamo le perdite di memoria osservando le vecchie dimensioni di generazione dopo la raccolta e l'avviso su una soglia. Funziona abbastanza bene e in effetti ha salvato la nostra bacon solo due settimane fa.
In particolare, per +UseParallelOldGC
, facciamo la seguente:
ManagementFactory.getMemoryPoolMXBeans()
- Cercare il
MemoryPoolMXBean
risultato con il nome che termina in"Old Gen"
- Confronta
getCollectionUsage().getUsed()
(se disponibile) congetMax()
Sfortunatamente, sembra che G1 non abbia più il concetto di getCollectionUsage()
.
Fondamentalmente, tuttavia, ci piacerebbe monitorare la dimensione dell'heap G1 dopo l'ultima raccolta mista che sceglie di fare in un ciclo misto o qualcosa di simile.
Per esempio, al di fuori della VM sarei felice con uno script awk che semplicemente trovato l'ultimo '(mixed)'
stato che è seguito da un '(young)'
e guardare ciò che la dimensione finale heap è stato (ad esempio, '1540.0M' 'Heap: 3694.5M(9216.0M)->1540.0M(9216.0M)'
)
C'è qualche modo di farlo all'interno della Java VM?
questo dovrebbe fornire informazioni simili: http://stackoverflow.com/a/ 32509813/1362755 – the8472