对于1GB堆,在可视VM中运行计算保留大小的时间有多长?

Joe*_*Joe 9 java memory heap visualvm

我从堆空间用尽的java进程中获得了1 GB的堆转储.我已将堆上传到jvisualm,它带有java6发行版.我在16个小时前开始了"计算保留大小"流程并且它仍在运行.在1GB堆上运行前20个对象的计算保留大小需要多长时间?我应该期待它能完成吗?

Joh*_*esB 6

这似乎在我的机器上也将永远存在,但是我从任务管理器中注意到,似乎不再发生任何事情(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)
Run Code Online (Sandbox Code Playgroud)

默认情况下,我的64位Java VM堆大小将限制为计算机内存的25%(甚至更低的VisualVM内置限制)。为了解决下一个问题,我将再次尝试启动VisualVM,如下所示:

jvisualvm.exe -J-Xmx16g
Run Code Online (Sandbox Code Playgroud)

之后,日志在启动时显示:

Heap memory usage: initial 24,0MB maximum 14563,6MB
Run Code Online (Sandbox Code Playgroud)


Rob*_*b I 2

我有一个 600MB 的堆,只需要 900 CPU 分钟的时间来计算保留的大小。那是15个小时。我认为它与堆上的内容非常相关,所以我不会推断到你的堆(你也指出它没有完成;),但这是另一个数据点。