Eirik Bakke created NETBEANS-406:
------------------------------------
Summary: addPropertyChangeListener w/o matching
removePropertyChangeListener
Key: NETBEANS-406
URL: https://issues.apache.org/jira/browse/NETBEANS-406
Project: NetBeans
Issue Type: Bug
Components: editor - CSL (API & infrastructure), editor -
Painting & Printing
Affects Versions: 8.2, 9.0
Environment: Product Version: Apache NetBeans IDE Dev (Build
incubator-netbeans-release-205-on-20180202)
Java: 9.0.4.1; OpenJDK 64-Bit Server VM 9.0.4.1+11
Runtime: OpenJDK Runtime Environment 9.0.4.1+11
System: Mac OS X version 10.9.5 running on x86_64; UTF-8; en_US (nb)
Reporter: Eirik Bakke
The following warning appears in the IDE log every now and then in 8.2 and 9.0
beta:
{code:java}
WARNING [org.openide.util.WeakListenerImpl]: Can't remove
java.beans.PropertyChangeListener using method
org.netbeans.modules.editor.NbEditorDocument.removePropertyChangeListener from
org.netbeans.modules.editor.NbEditorDocument@299b063c,
mimeType='text/x-editor-search', kitClass=null, length=9, version=15,
file=null{code}
The warning above can be reproduced by opening a Java editor, closing all
editors, and then invoking a GC with by double-clicking the memory meter in the
"Performance" toolbar item.
This bug was previously discussed in Bugzilla at
[https://netbeans.org/bugzilla/show_bug.cgi?id=196323] . Not sure what priority
to put for this bug; it's a memory leak, but I'm not sure how big of an impact
it has.
*Analysis*
Storing a stacktrace in WeakListenerImpl.ListenerReference on creation and then
printing it on the failed removal shows the place where the problematic
listener is added:
{code:java}
java.lang.Exception
at
org.openide.util.WeakListenerImpl$ListenerReference.<init>(WeakListenerImpl.java:554)
at org.openide.util.WeakListenerImpl.<init>(WeakListenerImpl.java:109)
at org.openide.util.WeakListenerImpl.<init>(WeakListenerImpl.java:99)
at
org.openide.util.WeakListenerImpl$PropertyChange.<init>(WeakListenerImpl.java:187)
at org.openide.util.WeakListeners.propertyChange(WeakListeners.java:282)
at
org.netbeans.modules.editor.lib2.view.DocumentViewOp.checkSettingsInfo(DocumentViewOp.java:937)
at
org.netbeans.modules.editor.lib2.view.DocumentViewOp.checkViewsInited(DocumentViewOp.java:622)
at
org.netbeans.modules.editor.lib2.view.DocumentView.getPreferredSpan(DocumentView.java:251)
at
javax.swing.plaf.basic.BasicTextUI$RootView.getPreferredSpan(BasicTextUI.java:1353)
at javax.swing.plaf.basic.BasicTextUI.getPreferredSize(BasicTextUI.java:919)
at javax.swing.JComponent.getPreferredSize(JComponent.java:1662)
at javax.swing.JEditorPane.getPreferredSize(JEditorPane.java:1333)
at
org.netbeans.modules.editor.NbEditorUI$LayeredEditorPane.getPreferredSize(NbEditorUI.java:475){code}
The problem is on this line of DocumentViewOp:
{code:java}
o.n.modules.editor.lib2.view.DocumentUtilities.addPropertyChangeListener(doc,
WeakListeners.propertyChange(this, doc));{code}
The DocumentUtilities.addPropertyChangeListener is a special API for allowing
property change listeners to be attached to BaseDocument instances (see
#181073). Since it doesn't actually add
addPropertyChangeListener/removePropertyChangeListener methods to BaseDocument,
it doesn't work with WeakListeners.
As far as I can see, the only place that actually uses
DocumentUtilities.addPropertyChangeListener is the single line i DocumentViewOp
above.
I would propose adding a removedPropertyChangeListener method to BaseDocument
that delegates to DocumentUtilities.removePropertyChangeListener (or performs
the equivalent logic itself). This way the WeakListener will find the method it
expects when the listener is due to be removed, and the property change events
will still have the Document instance as the event source instead of the
delegate PropertyChangeSupport, as is probably desired.
An alternative is to make WeakListeners aware of the special setup wrt.
property change listeners on BaseDocument instances. But that seems like an
abstraction violation.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists