RFR: 8277848 Binding and Unbinding to List leads to memory leak [v2]
Michael Strauß
mstrauss at openjdk.java.net
Fri Dec 31 12:57:19 UTC 2021
On Tue, 7 Dec 2021 15:21:56 GMT, Florian Kirmaier <fkirmaier at openjdk.org> wrote:
>> Making the initial listener of the ListProperty weak fixes the problem.
>> The same is fixed for Set and Map.
>> Due to a smart implementation, this is done without any performance drawback.
>> (The trick is to have an object, which is both the WeakReference and the Changelistener)
>> By implying the same trick to the InvalidationListener, this should even improve the performance of the collection properties.
>
> Florian Kirmaier has updated the pull request incrementally with one additional commit since the last revision:
>
> JDK-8277848
> Added missing change
Why are the new listener imlementations called `BaseChangeListener` and `BaseInvalidationListener`, i.e. why the _Base_?
Also, if you're going to the trouble of refactoring the existing listener implementation, have you considered merging the very similar implementations into a single class? You can then re-use the listener instance and save another object allocation in this way:
private static class Listener<E> extends WeakReference<ListPropertyBase<E>>
implements InvalidationListener, ListChangeListener<E>, WeakListener {
Listener(ListPropertyBase<E> ref) {
super(ref);
}
@Override
public boolean wasGarbageCollected() {
return get() == null;
}
@Override
public void onChanged(Change<? extends E> change) {
ListPropertyBase<E> ref = get();
if(ref != null) {
ref.invalidateProperties();
ref.invalidated();
ref.fireValueChangedEvent(change);
}
}
@Override
public void invalidated(Observable observable) {
ListPropertyBase<E> ref = get();
if (ref == null) {
observable.removeListener(this);
} else {
ref.markInvalid(ref.value);
}
}
}
-------------
PR: https://git.openjdk.java.net/jfx/pull/689
More information about the openjfx-dev
mailing list