Normalmente, quello che uso è incluso nell'importo ParseHeapDump.sh
Eclipse Memory Analyzer e descritti here, e lo faccio su una i nostri server più rinforzati (scarica e copia su linux .zip distro, decomprimi qui). Lo script della shell richiede meno risorse rispetto all'analisi dell'heap dalla GUI, inoltre è possibile eseguirlo sul tuo server con più risorse (puoi allocare più risorse aggiungendo qualcosa come -vmargs -Xmx40g -XX:-UseGCOverheadLimit
alla fine dell'ultima riga dello script. Per esempio, l'ultima riga del file potrebbe assomigliare a questo dopo la modifica
./MemoryAnalyzer -consolelog -application org.eclipse.mat.api.parse "[email protected]" -vmargs -Xmx40g -XX:-UseGCOverheadLimit
gestire l'iT come ./path/to/ParseHeapDump.sh ../today_heap_dump/jvm.hprof
dopo che riesce, si crea un certo numero di file "indice" accanto al file .hprof.
Dopo aver creato gli indici, provo a generare valuta i rapporti da quel punto e scarica quei rapporti sulle mie macchine locali e prova a vedere se riesco a trovare il colpevole proprio da quello (non solo i rapporti, non gli indici). Ecco un tutorial su creating the reports.
esempio di report:
./ParseHeapDump.sh ../today_heap_dump/jvm.hprof org.eclipse.mat.api:suspects
Altre opzioni di rapporto:
org.eclipse.mat.api:overview
e org.eclipse.mat.api:top_components
Se tali relazioni non sono sufficienti e se ho bisogno di un po 'di scavo (vale a dirediciamo via oql), scp gli indici oltre al file hprof sulla mia macchina locale, e poi apro il dump dell'heap (con gli indici nella stessa directory del dump dell'heap) con la mia GUI di Eclipse MAT. Da lì, non ha bisogno di troppa memoria per essere eseguito.
EDIT: mi piaceva aggiungere due note:
- Per quanto ne so, solo la generazione degli indici è la parte di memoria ad alta intensità di Eclipse MAT. Dopo aver ottenuto gli indici, la maggior parte dell'elaborazione da parte di Eclipse MAT non richiederebbe molta memoria.
- Fare questo su uno script di shell significa che posso farlo su un server headless (e di solito lo faccio anche su un server headless, perché normalmente sono i più potenti). E se si dispone di un server in grado di generare un dump dell'heap di tale dimensione, è probabile che sia disponibile un altro server in grado di elaborare anche gran parte del dump dell'heap.
fonte
2011-08-31 08:35:58
Sei sicuro che il dump non sia corrotto e che tu stia utilizzando una versione più recente dei JAR DTFJ? Le caratteristiche di 'ArrayIndexOutOfBoundsException' in atleast [two] (https://bugs.eclipse.org/bugs/show_bug.cgi?id=294311) [bug] (https://bugs.eclipse.org/bugs/show_bug.cgi ? id = 307.530). Lo sto affermando perché non hai riportato [un OOME durante l'esecuzione di MAT, che ha una correzione diversa] (http://wiki.eclipse.org/MemoryAnalyzer/FAQ#Out_of_Memory_Error_while_Running_the_Memory_Analyzer). –
jhat usa heapMap per memorizzare gli oggetti letti, che cresce esponenzialmente con il numero di oggetti memorizzati nell'heap. Un'opzione è di cambiare il decl da heapMap a TreeMap ed eseguire la dimensione heap di jhat almeno grande quanto il processo. – codeDr