Jesse Glick created NETBEANS-861:
------------------------------------

             Summary: Terrible UI performance using Ubuntu's packaged JRE due 
to AtkWrapper
                 Key: NETBEANS-861
                 URL: https://issues.apache.org/jira/browse/NETBEANS-861
             Project: NetBeans
          Issue Type: Bug
          Components: platform - JDK Problems
            Reporter: Jesse Glick


I recently noticed very poor UI responsiveness, seeming to get worse over time. 
For example, just moving the selection around tree nodes in the *Projects* tab 
had ~1s delays, which was frustrating. *Alt-Shift-Y* pointed me to 
{{org.GNOME.Accessibility.AtkWrapper.emitSignal}} from {{JLabel.setText}} as a 
hotspot, confirmed with

{code:none}
while :; do jstack $NBPID | fgrep AtkWrapper; sleep 1; done
{code}

and in thread dump excerpts like

{code:none}
"AWT-EventQueue-2" ...
   java.lang.Thread.State: RUNNABLE
        at org.GNOME.Accessibility.AtkWrapper.emitSignal(Native Method)
        at 
org.GNOME.Accessibility.AtkWrapper$5.propertyChange(AtkWrapper.java:545)
        at java.beans.PropertyChangeSupport.fire(PropertyChangeSupport.java:335)
        at 
java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:327)
        at 
java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:263)
        at 
javax.accessibility.AccessibleContext.firePropertyChange(AccessibleContext.java:768)
        at javax.swing.JLabel.setIcon(JLabel.java:393)
        at 
org.openide.explorer.view.NodeRenderer.configureFrom(NodeRenderer.java:229)
        at 
org.openide.explorer.view.NodeRenderer.getTreeCellRendererComponent(NodeRenderer.java:138)
        at javax.swing.plaf.basic.BasicTreeUI.paintRow(BasicTreeUI.java:1536)
        at javax.swing.plaf.basic.BasicTreeUI.paint(BasicTreeUI.java:1224)
        at javax.swing.plaf.metal.MetalTreeUI.paint(MetalTreeUI.java:169)
        at javax.swing.plaf.ComponentUI.update(ComponentUI.java:161)
        at javax.swing.JComponent.paintComponent(JComponent.java:780)
        at javax.swing.JComponent.paint(JComponent.java:1056)
        at 
org.openide.explorer.view.TreeView$ExplorerTree.access$1301(TreeView.java:1694)
        at 
org.openide.explorer.view.TreeView$ExplorerTree.guardedPaint(TreeView.java:1836)
        at 
org.openide.explorer.view.TreeView$ExplorerTree.access$1600(TreeView.java:1694)
        at 
org.openide.explorer.view.TreeView$ExplorerTree$GuardedActions.run(TreeView.java:2163)
        at 
org.netbeans.modules.openide.util.DefaultMutexImplementation.readAccess(DefaultMutexImplementation.java:188)
        at 
org.netbeans.modules.openide.util.DefaultMutexImplementation$1R.run(DefaultMutexImplementation.java:1014)
        at 
org.openide.nodes.Children$ProjectManagerDeadlockDetector.execute(Children.java:1913)
        at 
org.netbeans.modules.openide.util.DefaultMutexImplementation.doWrapperAccess(DefaultMutexImplementation.java:1035)
        at 
org.netbeans.modules.openide.util.DefaultMutexImplementation.readAccess(DefaultMutexImplementation.java:181)
        at org.openide.util.Mutex.readAccess(Mutex.java:193)
        at 
org.openide.explorer.view.TreeView$ExplorerTree$GuardedActions.<init>(TreeView.java:2155)
        at 
org.openide.explorer.view.TreeView$ExplorerTree.paint(TreeView.java:1807)
        at javax.swing.JComponent.paintChildren(JComponent.java:889)
        - locked <0x00000000800fba88> (a java.awt.Component$AWTTreeLock)
        at javax.swing.JComponent.paint(JComponent.java:1065)
        at javax.swing.JViewport.paint(JViewport.java:728)
        at javax.swing.JComponent.paintChildren(JComponent.java:889)
        - locked <0x00000000800fba88> (a java.awt.Component$AWTTreeLock)
        at javax.swing.JComponent.paint(JComponent.java:1065)
        at javax.swing.JComponent.paintChildren(JComponent.java:889)
        - locked <0x00000000800fba88> (a java.awt.Component$AWTTreeLock)
        at javax.swing.JComponent.paint(JComponent.java:1065)
        at javax.swing.JComponent.paintChildren(JComponent.java:889)
        - locked <0x00000000800fba88> (a java.awt.Component$AWTTreeLock)
        at javax.swing.JComponent.paint(JComponent.java:1065)
        at javax.swing.JComponent.paintChildren(JComponent.java:889)
        - locked <0x00000000800fba88> (a java.awt.Component$AWTTreeLock)
        at javax.swing.JComponent.paint(JComponent.java:1065)
        at 
org.netbeans.swing.tabcontrol.TabbedContainer.paint(TabbedContainer.java:969)
        at javax.swing.JComponent.paintChildren(JComponent.java:889)
        - locked <0x00000000800fba88> (a java.awt.Component$AWTTreeLock)
        at javax.swing.JComponent.paint(JComponent.java:1065)
        at javax.swing.JLayeredPane.paint(JLayeredPane.java:586)
        at javax.swing.JComponent.paintChildren(JComponent.java:889)
        - locked <0x00000000800fba88> (a java.awt.Component$AWTTreeLock)
        at javax.swing.JComponent.paint(JComponent.java:1065)
        at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210)
        at 
javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
        at 
javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
        at 
javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:306)
        at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
        at javax.swing.JComponent._paintImmediately(JComponent.java:5158)
        at javax.swing.JComponent.paintImmediately(JComponent.java:4969)
        at javax.swing.RepaintManager$4.run(RepaintManager.java:831)
        at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
        at java.security.AccessController.doPrivileged(Native Method)
        at 
java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
        at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
        at 
javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
        at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
        at 
javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
        at ...
{code}

I think that is running code [like 
this|https://github.com/GNOME/java-atk-wrapper/blob/5876a9c0f94c4db943862137218bc6ac9cbe4a70/wrapper/org/GNOME/Accessibility/AtkWrapper.java.in#L434].
 Searching around, I found [bug 
#791970|https://bugzilla.gnome.org/show_bug.cgi?id=791970], and confirmed that 
the {{master}} code still appears to have an obvious listener leak.

As per [this tip|https://stackoverflow.com/a/47985124/12916] I was able to 
confirm that the problems go away if you add 
{{-J-Djavax.accessibility.assistive_technologies=}} to the NB startup. I would 
propose that {{platform/lib/nbexec}} add this automatically when 
{{$jdkhome/jre/lib/ext/java-atk-wrapper.jar}} exists; or perhaps this can be 
done more dynamically in core startup code when 
{{org.GNOME.Accessibility.AtkWrapper}} is found in the bootstrap classpath.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org
For additional commands, e-mail: commits-h...@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists

Reply via email to