2011-11-29 20 views
8

Mam zrzucenie sterty 1 GB z procesu java, który zabrakło miejsca sterty. Przesłałem stertę do jvisualm, która pochodzi z dystrybucją java6. Rozpocząłem proces "Rozliczanie zachowanych rozmiarów" około 16 godzin temu i nadal trwa. Jak długo powinno trwać przetwarzanie zachowanych wielkości obliczeniowych dla 20 najlepszych obiektów na sterty 1 GB? Czy powinienem się spodziewać, że kiedykolwiek się skończy?Jak długo należy obliczać zachowane rozmiary w wizualnej maszynie wirtualnej dla sterty 1 GB?

+0

nie mam pojęcia, co mówisz (Mam małe doświadczenie z Javą), ale moja logika mówi mi, że jeśli nie uruchamiasz tego na 1 GHz z 1 GB RAM (lub mniej) systemu, 16 godzin to wahaay zbyt dużo ... – ComputerSaysNo

+0

Tylko dla ciekawości, zrobiłem to koniec? Jak długo to zajęło? Jeśli to się nie zakończyło, czy 2. bieg zakończył się sukcesem? – uhm

+0

Nigdy się nie skończyło. Zakończyłem pobieranie wersji próbnej YourKit i zakończyłem ten sam proces w około 20 minut. – Joe

Odpowiedz

1

Miałem 600MB sterty, która zajęła 900 CPU-minut czasu, aby obliczyć zachowane rozmiary. To 15 godzin. Zakładam, że jest to bardzo związane z tym, co jest na kupce, więc nie będę ekstrapolować na twoją kupę (również zauważyłeś, że to się nie skończyło;), ale jest to kolejny punkt danych.

4

Wydaje się, że trwa to również na moim komputerze, ale zauważyłem z menedżera zadań, że nic już nie dzieje się (niskie zużycie procesora, Dysk I/O). Powodem było to, że chociaż wskaźnik postępu wyświetla animację, akcja została po cichu przerwana zgodnie z plikiem dziennika.

Aby otworzyć dziennik użyłem kroki:

  • Kliknij Pomoc
  • Kliknij O
  • Kliknij Logfile

ten pokazał mi na dole dzienniku:

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) 

Domyślnie moje 64 bit Java VM Heapsize będzie ograniczony do 25% mojej pamięci komputera (lub nawet znacznie niższego limitu wbudowanego VisualVM). Aby rozwiązać ten problem dla mojej następnej próbie wil spróbować ponownie zaczynając VisualVM tak:

jvisualvm.exe -J-Xmx16g 

Po tym dziennik pokazuje przy starcie:

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

Znalazłem, że jvisualvm ignorował flagę wiersza poleceń mx z wiersza poleceń, ponieważ już pobiera domyślną wartość -Xmx256m z% JDK_HOME% \ lib \ visualvm \ etc \ visualvm.conf. Zobacz https://stackoverflow.com/questions/9570921/how-do-i-provide-jvm-arguments-to-visualvm –