Domanda

Qualcuno ha usato il gestore della memoria Eclipse per rilevare la perdita di memoria nei codici Java? Qualcuno può consigliare un buon posto in cui cercare informazioni sull'utilizzo di Memory Manager? Ho letto qualcosa online, mi suggerisce che devo far funzionare il programma fino a quando non si blocca (si verifica un errore di memoria insufficiente), che genererà un rapporto di arresto anomalo. Quindi utilizzare il gestore della memoria per aprire questo rapporto per esaminare dove potrebbe verificarsi la perdita di memoria. È così che tutti usano il gestore della memoria?

È stato utile?

Soluzione

Sebbene -XX: + HeapDumpOnOutOfMemoryError può essere utile, il mio flusso di lavoro corrente per l'utilizzo di Eclipse Memory Manager è:

  1. Esegui il programma normalmente
  2. Attendi che la memoria sfugga di mano.
  3. Esegui jmap : jmap -dump: format = b, file = dump.hprof < PID >
  4. Apri il file hprof in EMM.

Di solito inizio a lavorare con l'istogramma e le viste dell'albero del dominatore per vedere se qualcosa sembra fuori posto, quindi eseguo il drill down da lì.

VisualVM può essere utile ma sembra molto meno efficiente di EMM quando si lavora con un dump dell'heap (EMM memorizza nella cache molte informazioni sul caricamento del dump dell'heap). Netbeans Profiler è utile per ottenere le posizioni delle allocazioni e per la profilazione dei tempi.

Altri suggerimenti

Forse la cosa più semplice è eseguire il programma in HProf (viene fornito di serie con la JVM) per qualche tempo e forzare un'uscita. L'output di HProf dovrebbe sperare di darvi alcuni suggerimenti immediati riguardo. perdita di memoria.

A differenza del debugger di memoria Eclipse (di cui sono informato solo da ciò che scrivi) puoi raccogliere statistiche da qualsiasi punto dell'esecuzione.

  

suggerisce che devo far funzionare il programma fino a quando non si blocca (si verifica un errore di memoria insufficiente), che genererà un rapporto di arresto anomalo.

Non penso che sia vero - non otterrai un file di dump quando si verifica un OutOfMemoryError (scommetterei che l'autore sta confondendo questo problema con una sorta di bug JVM che potrebbe causare una discarica principale da salvare).

La procedura migliore è eseguire un dump dell'heap usando jmap ; questo genererà il contenuto dell'heap in un file binario (generalmente noto come file hprof). Questo file può quindi essere analizzato da un numero qualsiasi di analizzatori:

  • jhat - Strumento Sun che analizza il file hprof, avvia un server Web incorporato in modo da poter analizzare l'heap attraverso un browser Web / visualizzare i report. Ho scoperto che questo è molto lento per grandi cumuli.
  • VisualVM - Debugging impressionante / strumento di risoluzione dei problemi in bundle con JDK. Tra le altre cose, questo può anche essere usato per generare un dump dell'heap di qualsiasi processo in esecuzione, nonché un dump del thread. Ho scoperto che è molto lento caricare anche file hprof di grandi dimensioni.
  • Eclipse Memory Analyzer - Plugin Eclipse in grado di generare file hprof.

Consiglio vivamente di utilizzare il plug-in Eclipse, in quanto è molto veloce caricare dump di heap di grandi dimensioni (> 500 MB) (in meno di un minuto), produce report utili, supporta un linguaggio di query con logica complessa, ecc.

Questa pagina spiega come lavorare con jvm heap dump. Jhat è un modo più semplice, anche se meno grafico, di lavorare con gli heap, ma puoi anche caricare gli stessi file di dump nel gestore della memoria eclipse. Puoi anche ottenere alcune informazioni da jvisualvm, se stai utilizzando un jvm (1.6) corrente.

In genere preferisco le applicazioni di profilazione utilizzando NetBeans Profiler. Puoi facilmente vedere quali oggetti perdono e dove vengono creati nella maggior parte dei casi. Probabilmente ci sono molti altri strumenti che lo faranno, ma so che il profiler di NetBeans funziona bene ed è facile da usare.

Puoi provare a usare Jprobe . È possibile monitorare l'applicazione e guardare gli oggetti mentre vengono creati. Inoltre, questo aiuterà ad analizzare quali oggetti non raccolgono la spazzatura e saranno dei puntatori per andare avanti.

Anche se non è gratuito, ma ricordo che viene fornito con una licenza di prova, quindi verificalo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top