Come analizzo un file .hprof?


227

Ho un server di produzione in esecuzione con il seguente flag: - XX: + HeapDumpOnOutOfMemoryError

Ieri sera ha generato un file java-38942.hprof quando il nostro server ha riscontrato un errore heap. Si scopre che gli sviluppatori del sistema conoscevano la bandiera ma non avevano modo di ottenere informazioni utili da essa.

Qualche idea?

Risposte:


215

Se vuoi uno strumento abbastanza avanzato per dare un'occhiata seria, guarda il progetto Memory Analyzer su Eclipse, contribuito da SAP.

Parte di ciò che puoi fare è incredibilmente buono per trovare perdite di memoria, ecc., Incluso l'esecuzione di una forma di SQL limitato (OQL) contro gli oggetti in memoria, ad es.

SELEZIONA toString (nome) DA com.yourcompany.somepackage.User

Totalmente geniale.


18
Vorrei solo aggiungere un +100 per Eclipse Memory Analyzer. Attualmente sto tentando di setacciare un file di dump dell'heap di 400mb +, e ci sono voluti più di 70 minuti per leggere il file, prima che causasse un arresto anomalo completo di JVM. EMA è in grado di aprirlo in <5 minuti.
matt b

3
Continuo a ricevere errori di analisi quando apro i file HPROF usando Eclipse Memory Analyzer (che in realtà sono stati scaricati anche da Eclipse!). Sfortunato .. sospiro.
lost_bits1110

3
MAT può ancora richiedere un bel po 'di RAM [meno di JHAT ma comunque un bel po']. Consulta stackoverflow.com/questions/7254017/… per suggerimenti in caso di problemi.
rogerdpack,

71

È possibile utilizzare JHAT , lo strumento di analisi dell'heap Java fornito per impostazione predefinita con JDK. È la riga di comando ma avvia un server Web / browser che usi per esaminare la memoria. Non è il più facile da usare, ma almeno è già installato nella maggior parte dei luoghi in cui andrai. Una vista molto utile è il link "istogramma heap" in fondo.

ex: jhat -port 7401 -J-Xmx4G dump.hprof

jhat può eseguire anche OQL "in questi giorni" (link in basso "eseguire OQL")


Dopo aver eseguito il comando sopra Nella console visualizzerai il messaggio nel terminale "il server è pronto" Porta: 7401. Successivamente apri questo URL: localhost: 7401 "puoi vedere i dettagli nelle finestre del browser".
Laxman G,

35

È inoltre possibile utilizzare HeapWalker da Netbeans Profiler o dallo strumento autonomo di Visual VM . Visual VM è una buona alternativa a JHAT in quanto è indipendente, ma è molto più facile da usare rispetto a JHAT.

È necessario Java 6+ per utilizzare completamente Visual VM.


Si dovrebbe aggiungere una nota che questo è solo per Java 6 e 7.
Nick Stinemates

AFAIK, HeapWalker e VisualVM non richiedono Java 6/7 per leggere i file HPROF.
James Schek,

Ho appena provato a caricarlo con Java 5 e ha detto 'Si prega di utilizzare Java 6 o 7' Cosa sto facendo di sbagliato?
Nick mette in scena il

Hmm. Forse devi eseguire Java 6, ma puoi leggere un Java 5 HPROF (forse è così che l'ho fatto funzionare). So che non è possibile creare un dump dell'heap da Visual VM su un'app che esegue Java 5. Verrà aggiornato.
James Schek,

È inoltre possibile utilizzare JVM visiva, da Java SDK - look per jvisualvm.exea JAVASDK/bincartella
xxxvodnikxxx

11

Basta ottenere Eclipse Memory Analyzer . Non c'è niente di meglio là fuori ed è gratuito.

JHAT è utilizzabile solo per "applicazioni giocattolo"


3
JHAT è necessario per impressionare quegli hacker "l33t" che costruiscono a mano una distribuzione BSD a partire da LILO. Aspetta ... comunque non userebbero mai Java. :-)
James Schek,

Penso che questo sia più un commento ...: \
rogerdpack il


5

Se vuoi fare un'analisi personalizzata del tuo heapdump, allora c'è:

Questa libreria è veloce ma dovrai scrivere il tuo codice di analisi in Java.

Dai documenti:

  • Non crea alcun file temporaneo sul disco per elaborare il dump dell'heap
  • Può lavorare direttamente dump di heap compressi GZ
  • Notazione HeapPath

2

Personalmente preferisco VisualVM. Una delle funzionalità che mi piace in VisualVM è il confronto dei dump dell'heap. Quando si esegue un'analisi del dump dell'heap, ci sono vari modi per capire cosa ha causato l'incidente. Uno dei modi che ho trovato utile è fare un confronto tra discariche di heap sane e malsane.

Di seguito sono riportati i passaggi che è possibile seguire per questo:

  1. Ottenere un dump di heap di OutOfMemoryError chiamiamolo "oome.hprof". Puoi ottenerlo tramite il parametro JVM HeapDumpOnOutOfMemoryError.
  2. Riavvia l'applicazione lasciandola funzionare per un grande (minuti / ore) a seconda dell'applicazione. Ottieni un altro dump dell'heap mentre l'applicazione è ancora in esecuzione. Chiamiamolo "healthy.hprof".
  3. È possibile aprire entrambi questi dump in VisualVM ed eseguire un confronto dei dump dell'heap. Puoi farlo a livello di classe o pacchetto. Questo può spesso indicarti la direzione del problema.

link: https://visualvm.github.io

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.