JDK-6748331 : Deadlock in JConsole due to AWT operations performed outside EDT
  • Type: Bug
  • Component: tools
  • Sub-Component: jconsole
  • Affected Version: 6
  • Priority: P3
  • Status: Closed
  • Resolution: Duplicate
  • OS: generic
  • CPU: generic
  • Submitted: 2008-09-15
  • Updated: 2010-07-29
  • Resolved: 2008-09-15
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 6
6u12Resolved
Related Reports
Duplicate :  
Description
Using JConsole in an atypical configuration (connector server did not have all permissions), I encountered the following deadlock:

Found one Java-level deadlock:
=============================
"Worker-MBeans-service:jmx:rmi://noname/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjEyOS4xNTcuMjAzLjU5AADrL5lFIf2g0Ibx36cP+QAAARxmIQWmgAEAeA==":
  waiting to lock monitor 0x08d2d530 (object 0xcad0e208, a java.awt.Component$AWTTreeLock),
  which is held by "AWT-EventQueue-0"
"AWT-EventQueue-0":
  waiting to lock monitor 0x08125f1c (object 0xf65afc90, a sun.tools.jconsole.inspector.XTree),
  which is held by "Worker-MBeans-service:jmx:rmi://noname/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjEyOS4xNTcuMjAzLjU5AADrL5lFIf2g0Ibx36cP+QAAARxmIQWmgAEAeA=="

Java stack information for the threads listed above:
===================================================
"Worker-MBeans-service:jmx:rmi://noname/stub/rO0ABXNyAC5qYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkuUk1JU2VydmVySW1wbF9TdHViAAAAAAAAAAICAAB4cgAaamF2YS5ybWkuc2VydmVyLlJlbW90ZVN0dWLp/tzJi+FlGgIAAHhyABxqYXZhLnJtaS5zZXJ2ZXIuUmVtb3RlT2JqZWN002G0kQxhMx4DAAB4cHc5AAtVbmljYXN0UmVmMgAADjEyOS4xNTcuMjAzLjU5AADrL5lFIf2g0Ibx36cP+QAAARxmIQWmgAEAeA==":
	at java.awt.Container.addImpl(Container.java:1000)
	- waiting to lock <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.CellRendererPane.addImpl(CellRendererPane.java:89)
	at java.awt.Container.add(Container.java:352)
	at javax.swing.plaf.basic.BasicTreeUI$NodeDimensionsHandler.getNodeDimensions(BasicTreeUI.java:2715)
	at javax.swing.tree.AbstractLayoutCache.getNodeDimensions(AbstractLayoutCache.java:475)
	at javax.swing.tree.VariableHeightLayoutCache$TreeStateNode.updatePreferredSize(VariableHeightLayoutCache.java:1342)
	at javax.swing.tree.VariableHeightLayoutCache.rebuild(VariableHeightLayoutCache.java:720)
	at javax.swing.tree.VariableHeightLayoutCache.treeStructureChanged(VariableHeightLayoutCache.java:626)
	at javax.swing.plaf.basic.BasicTreeUI$Handler.treeStructureChanged(BasicTreeUI.java:3829)
	at javax.swing.tree.DefaultTreeModel.fireTreeStructureChanged(DefaultTreeModel.java:561)
	at javax.swing.tree.DefaultTreeModel.nodeStructureChanged(DefaultTreeModel.java:347)
	at sun.tools.jconsole.inspector.XTree.removeAll(XTree.java:136)
	- locked <0xf65afc90> (a sun.tools.jconsole.inspector.XTree)
	at sun.tools.jconsole.MBeansTab.synchroniseMBeanServerView(MBeansTab.java:101)
	at sun.tools.jconsole.MBeansTab$1.run(MBeansTab.java:184)
	at sun.tools.jconsole.Worker.run(Worker.java:37)
"AWT-EventQueue-0":
	at java.awt.Component.getName(Component.java:786)
	- waiting to lock <0xf65afc90> (a sun.tools.jconsole.inspector.XTree)
	at com.sun.java.swing.plaf.gtk.GTKStyle.getColor(GTKStyle.java:176)
	at javax.swing.plaf.synth.SynthLookAndFeel.paintRegion(SynthLookAndFeel.java:367)
	at javax.swing.plaf.synth.SynthLookAndFeel.update(SynthLookAndFeel.java:331)
	at javax.swing.plaf.synth.SynthTreeUI.update(SynthTreeUI.java:202)
	at javax.swing.JComponent.paintComponent(JComponent.java:763)
	at javax.swing.JComponent.paint(JComponent.java:1027)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JViewport.paint(JViewport.java:747)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JSplitPane.paintChildren(JSplitPane.java:1026)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JLayeredPane.paint(JLayeredPane.java:564)
	at javax.swing.JComponent.paintChildren(JComponent.java:864)
	- locked <0xcad0e208> (a java.awt.Component$AWTTreeLock)
	at javax.swing.JComponent.paint(JComponent.java:1036)
	at javax.swing.JComponent.paintToOffscreen(JComponent.java:5122)
	at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1382)
	at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1313)
	at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:301)
	at javax.swing.RepaintManager.paint(RepaintManager.java:1128)
	at javax.swing.JComponent._paintImmediately(JComponent.java:5070)
	at javax.swing.JComponent.paintImmediately(JComponent.java:4880)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:723)
	at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:679)
	at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:659)
	at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:128)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)

Found 1 deadlock.

It looks as if the operation in the non-EDT thread should be using invokeLater.

Comments
EVALUATION The method synchroniseMBeanServerView has been refactored as a side effect of 6439590. The refactoring splits the method in two - and ensures that XTree.removeAll is now called in the EDT. It seems therefore that this bug is fixed by 6439590. 6439590 is fixed both in 6u10 and JDK 7.
15-09-2008