2011-11-29 10 views
8

Ho un dump dell'heap da 1 GB da un processo java che ha esaurito lo spazio heap. Ho caricato l'heap in jvisualm fornito con una distribuzione java6. Ho iniziato il processo di "calcolo delle dimensioni trattenute" circa 16 ore fa ed è ancora in esecuzione. Quanto tempo ci vuole per eseguire le dimensioni di calcolo conservate per i primi 20 oggetti su un heap da 1 GB? Devo aspettarmi che finisca mai?Per quanto tempo è necessario eseguire le dimensioni di calcolo conservate nella VM visiva per un heap da 1 GB?

+0

Non ho idea di che cosa stai parlando (Ho poca esperienza con Java), ma la mia logica mi dice che se non stai eseguendo questo su 1 GHz con 1 GB di RAM (o meno) sistema, 16 ore sono mooolto troppo ... – ComputerSaysNo

+0

Solo per curiosità, lo ha fatto finire? Quanto ci è voluto? Se non è stato completato, una seconda corsa è terminata correttamente? – uhm

+0

Non è mai finito. Ho finito per scaricare una versione di prova di YourKit e ho completato la stessa procedura in circa 20 minuti. – Joe

risposta

1

Avevo un heap da 600 MB che richiedeva appena 900 CPU-minuti di tempo per calcolare le dimensioni mantenute. Sono 15 ore. Suppongo che sia molto correlato a cosa c'è nell'heap, quindi non estrapolerò il tuo heap (anche tu hai sottolineato che non è stato completato;), ma è un altro punto dati.

4

Sembra che ci voglia per sempre anche sulla mia macchina, ma ho notato dal task manager che nulla sembrava più accadere (poca CPU, Disk I/O). Il motivo era che sebbene l'indicatore di avanzamento continuasse a mostrare un'animazione, l'azione è stata interrotta in modo silenzioso in base al file di registro.

Per aprire il registro che ho usato come segue:

  • Fare clic su Guida
  • Clicca Chi
  • Clicca Logfile

Questo mi ha mostrato alla fine del registro:

SEVERE [org.openide.util.RequestProcessor] 
java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at java.util.HashMap.newNode(HashMap.java:1734) 
    at java.util.HashMap.putVal(HashMap.java:630) 
    at java.util.HashMap.put(HashMap.java:611) 
    at java.util.HashSet.add(HashSet.java:219) 
    at org.netbeans.lib.profiler.heap.DominatorTree.intersect(DominatorTree.java:279) 
    at org.netbeans.lib.profiler.heap.DominatorTree.computeOneLevel(DominatorTree.java:114) 
    at org.netbeans.lib.profiler.heap.DominatorTree.computeDominators(DominatorTree.java:64) 
    at org.netbeans.lib.profiler.heap.HprofHeap.computeRetainedSize(HprofHeap.java:537) 
    at org.netbeans.lib.profiler.heap.HprofHeap.computeRetainedSizeByClass(HprofHeap.java:594) 
    at org.netbeans.lib.profiler.heap.ClassDump.getRetainedSizeByClass(ClassDump.java:102) 
    at org.netbeans.modules.profiler.heapwalk.HeapFragmentWalker.computeRetainedSizes(HeapFragmentWalker.java:100) 
    at org.netbeans.modules.profiler.heapwalk.ClassPresenterPanel$1$1.run(ClassPresenterPanel.java:187) 
    at org.openide.util.RequestProcessor$Task.run(RequestProcessor.java:1393) 
[catch] at org.openide.util.RequestProcessor$Processor.run(RequestProcessor.java:2003) 

Per impostazione predefinita, il mio 64 bit Java VM Heapsize sarà limitato al 25% della memoria del mio computer (o anche a un limite predefinito VisualVM molto più basso). Per risolvere questo problema per il mio prossimo tentativo I wil provare di nuovo a partire VisualVM come questo:

jvisualvm.exe -J-Xmx16g 

Dopo questo registro mostra all'avvio:

Heap memory usage: initial 24,0MB maximum 14563,6MB 
+1

Ho scoperto che jvisualvm stava ignorando il flag della riga di comando mx dalla riga di comando, poiché stava già inserendo un valore predefinito di -Xmx256m da% JDK_HOME% \ lib \ visualvm \ etc \ visualvm.conf. Vedi https://stackoverflow.com/questions/9570921/how-do-i-provide-jvm-arguments-to-visualvm –

Problemi correlati