--- old/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java 2016-08-05 12:04:42.990931999 +0530 +++ new/src/java.desktop/unix/classes/sun/awt/X11/XTrayIconPeer.java 2016-08-05 12:04:42.774824000 +0530 @@ -93,7 +93,6 @@ if (XWM.getWMID() != XWM.METACITY_WM) { parentXED = dummyXED; // We don't like to leave it 'null'. - } else { parentXED = new XEventDispatcher() { // It's executed under AWTLock. @@ -300,10 +299,18 @@ removeXED(getWindow(), eframeXED); removeXED(eframeParentID, parentXED); + removeListeners(); eframe.realDispose(); balloon.dispose(); isTrayIconDisplayed = false; + canvas.dispose(); + canvas = null; + popup = null; + balloon = null; + tooltip = null; XToolkit.targetDisposedPeer(target, this); + target = null; + eframe = null; } public static void suppressWarningString(Window w) { @@ -415,6 +422,12 @@ canvas.addMouseMotionListener(eventProxy); eframe.addMouseListener(eventProxy); } + + void removeListeners() { + canvas.removeMouseListener(eventProxy); + canvas.removeMouseMotionListener(eventProxy); + eframe.removeMouseListener(eventProxy); + } long getWindow() { return AWTAccessor.getComponentAccessor() @@ -550,6 +563,11 @@ super.repaintImage(doClear || (old_autosize != autosize)); } + + public void dispose() { + super.dispose(); + target = null; + } } @SuppressWarnings("serial") // JDK-implementation class @@ -572,6 +590,10 @@ } repaintImage(true); } + + public void dispose() { + observer = null; + } // Invoke on EDT. protected void repaintImage(boolean doClear) {