我有一个来自堆空间不足的 java 进程的 1 GB 堆转储。我已将堆上传到 java6 发行版附带的 jvisualm 中。我大约在 16 小时前开始了“计算保留大小”过程,它仍在运行。运行 1GB 堆上前 20 个对象的计算保留大小需要多长时间?我应该期望它完成吗?
问问题
4712 次
2 回答
9
在我的机器上似乎也需要很长时间,但我从任务管理器中注意到似乎什么都没有发生(低 CPU 使用率,磁盘 I/O)。原因是尽管进度指示器一直显示动画,但根据日志文件,该操作被静默中止。
要打开日志,我使用了以下步骤:
- 单击帮助
- 点击关于
- 单击日志文件
这在日志的底部显示了我:
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 Heapsize 将限制为我计算机内存的 25%(甚至是更低的 VisualVM 内置限制)。为了在下一次尝试中解决这个问题,我将再次尝试像这样启动 VisualVM:
jvisualvm.exe -J-Xmx16g
在此之后,日志在启动时显示:
Heap memory usage: initial 24,0MB maximum 14563,6MB
于 2016-11-29T15:21:54.430 回答
2
我有一个 600MB 的堆,只需要 900 分钟的 CPU 时间来计算保留的大小。那是15个小时。我会假设它与堆上的内容非常相关,所以我不会推断你的堆(你也指出它没有完成;),但这是另一个数据点。
于 2012-01-17T13:54:58.840 回答