2014-04-30 16 views
5

Abbiamo alcuni problemi di perdita di memoria sulle macchine virtuali in produzione che eseguono applicazioni Java, l'utilizzo dell'heap di Old Gen cresce rapidamente ogni giorno, quindi voglio creare il dump dell'heap per analizzarlo.È possibile creare un dump di heap per analizzare la perdita di memoria senza garbage collection?

Tuttavia, ho notato che VisualVM eseguirà il GC completo prima del dump dell'heap che pulirà il vecchio gen, in tal caso, il dump dell'heap sarebbe inutile.

Ho anche cercato di utilizzare il seguente comando:

jmap dump: live, format = b, file = heap.bin

Sarà anche innescare un GC pieno.

Posso chiedere se esiste un modo in cui è possibile creare il dump dell'heap senza GC completo (o senza GC)? O c'è un modo migliore per analizzare la perdita di memoria?

versione del JDK: 1.7.0_45

Grazie.

risposta

3

Per creare un dump dell'heap, ci sarà un GC completo. Lo stesso vale quando si crea un istogramma di classe fuori dall'heap.

Se si desidera analizzare la perdita di memoria tra GC completi, probabilmente il profilo di memoria utilizzando un profiler Java (Mission Control, jProfiler, ecc.) È l'unica opzione possibile.

Vedere questa Q/A per Java Mission Control Heap Profile.

+0

Ho provato a utilizzare Mission Control e aggiungere -XX: + UnlockCommercialFeatures -XX: + FlightRecorder su VM per Flight Recorder, tuttavia, non è stato possibile avviare l'applicazione. Ho ricevuto un messaggio di errore che diceva "Errore durante l'inizializzazione del JFR. JFR verrà disattivato java.lang.Exception: Impossibile strumento Throwable! in oracle.jrockit.jfr.VMJFR.instrument (VMJFR.java:408) in oracle.jrockit .jfr.JFR.init (JFR.java:108) " – zhengyu

+0

vedere http://stackoverflow.com/q/19056826/772000 –

5

È possibile attivare HeapDump utilizzando il bean JMX HotSpotDiagnostic e il secondo parametro del metodo impostato su false.

Vedere questa risposta per una risposta più dettagliata: https://stackoverflow.com/a/35575793/236528

1

è sufficiente rimuovere dal vivo l'opzione e si dovrebbe essere buono. Quando stai fornendo l'opzione "live" a jmap. stai costringendo JVM a eseguire un GC completo e catturare quelli che si suppone siano "vivi". usare jmap -dump: format = b, file = hd.hprof piuttosto.

+0

Questo metodo funziona perfettamente. – alexandrul

Problemi correlati