visualvm
visualvm copied to clipboard
AWT thread blocked for few minutes while expanding GC root
Describe the bug AWT is blocked for a long time, if some cases OOME is also thrown. The problem will happen in the heap dumps, which have a very long path to GC root. Over 10.000 nodes.
To Reproduce Steps to reproduce the behavior:
- Open heap dump with very long path to GC root
- Select instance with a long path to GC root
- Select 'GC root' tab
- AWT is blocked till the whole path to GC root is expanded
AWT is blocked in the code below:
"AWT-EventQueue-0" #20 prio=6 os_prio=31 tid=0x00007f8b1daef000 nid=0x1200f runnable [0x00007000084cd000]
java.lang.Thread.State: RUNNABLE
at javax.swing.tree.TreePath.equals(TreePath.java:258)
at java.util.Hashtable.get(Hashtable.java:368)
- locked <0x0000000792648b40> (a java.util.Hashtable)
at javax.swing.JTree.isExpanded(JTree.java:2012)
at javax.swing.JTree.setExpandedState(JTree.java:3568)
at javax.swing.JTree.expandPath(JTree.java:2219)
at org.graalvm.visualvm.lib.ui.swing.ProfilerTreeTable$ProfilerTreeTableTree.expandPath(ProfilerTreeTable.java:1500)
at org.graalvm.visualvm.lib.ui.swing.ProfilerTreeTable.expandPath(ProfilerTreeTable.java:373)
at org.graalvm.visualvm.heapviewer.ui.TreeTableView.expandNode(TreeTableView.java:372)
at org.graalvm.visualvm.heapviewer.java.impl.PathToGCRootPlugin$1.fullyExpandNode(PathToGCRootPlugin.java:242)
at org.graalvm.visualvm.heapviewer.java.impl.PathToGCRootPlugin$1.childrenChanged(PathToGCRootPlugin.java:235)
at org.graalvm.visualvm.heapviewer.ui.TreeTableView$1.updateChildren(TreeTableView.java:145)
at org.graalvm.visualvm.heapviewer.model.HeapViewerNode$1.done(HeapViewerNode.java:206)
- locked <0x000000079243b538> (a org.graalvm.visualvm.heapviewer.ui.TreeTableView$1)
at javax.swing.SwingWorker$5.run(SwingWorker.java:737)
at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.run(SwingWorker.java:832)
at sun.swing.AccumulativeRunnable.run(AccumulativeRunnable.java:112)
at javax.swing.SwingWorker$DoSubmitAccumulativeRunnable.actionPerformed(SwingWorker.java:842)
at javax.swing.Timer.fireActionPerformed(Timer.java:313)
at javax.swing.Timer$DoPostEvent.run(Timer.java:245)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:758)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:728)
at org.netbeans.core.TimableEventQueue.dispatchEvent(TimableEventQueue.java:136)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)