У меня есть дамп кучи объемом 1 ГБ из процесса Java, в котором не хватило места в куче. Я загрузил кучу в jvisualm, который поставляется с дистрибутивом java6. Я запустил процесс «вычислить сохраненные размеры» около 16 часов назад, и он все еще работает. Сколько времени должно пройти, чтобы вычислить сохраненные размеры для 20 основных объектов в куче размером 1 ГБ? Должен ли я ожидать, что это когда-нибудь закончится?
Как долго можно выполнять вычисление сохраненных размеров в визуальной виртуальной машине для кучи размером 1 ГБ?
Ответы (2)
Кажется, на моей машине это тоже заняло целую вечность, но я заметил в диспетчере задач, что больше ничего не происходит (низкая загрузка ЦП, дисковый ввод-вывод). Причина заключалась в том, что, хотя индикатор выполнения продолжает показывать анимацию, действие было автоматически прервано в соответствии с файлом журнала.
Чтобы открыть журнал, я использовал следующие шаги:
- Нажмите Справка
- Нажмите О программе
- Щелкните файл журнала.
Это показало мне внизу журнала:
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)
По умолчанию мой 64-битный размер кучи Java VM будет ограничен 25% памяти моего компьютера (или даже гораздо меньшим встроенным пределом VisualVM). Чтобы решить эту проблему для моей следующей попытки, я попытаюсь снова запустить VisualVM следующим образом:
jvisualvm.exe -J-Xmx16g
После этого журнал показывает при запуске:
Heap memory usage: initial 24,0MB maximum 14563,6MB
У меня была куча размером 600 МБ, которой потребовалось всего 900 минут процессорного времени для вычисления сохраненных размеров. Это 15 часов. Я бы предположил, что это очень связано с тем, что находится в куче, поэтому я не буду экстраполировать на вашу кучу (также вы указали, что это не закончилось;), но это еще одна точка данных.