RFR: 8283551: ControlAcceleratorSupport menu items listener causes memory leak [v2]
Dean Wookey
dwookey at openjdk.org
Fri Feb 24 13:01:20 UTC 2023
On Fri, 24 Feb 2023 10:04:48 GMT, Dean Wookey <dwookey at openjdk.org> wrote:
>> Each time a menu would change scenes, a new set of ListChangeListeners would be added to the items in the menu. The bigger problem however is that these list change listeners have a strong reference to the scene which is potentially a much bigger leak.
>>
>> The first commit was more straightforward, but there are 2 things that might be of concern:
>>
>> 1. The method removeAcceleratorsFromScene takes in a scene parameter, but it'll remove all the ListChangeListeners attached to it, regardless of which scene was passed in. Something similar happens with changeListenerMap already, so I think it's fine.
>> 2. I made the remove method public so that external calls from skins to remove the accelerators would remove the ListChangeListener and also because all the remove methods are public.
>>
>> After I wrote more tests I realised using the ObservableLists as keys in the WeakHashMaps was a bad idea. If Java had a WeakIdentityHashMap the fix would be simple. The fix is in the second commit.
>>
>> There are still more issues that stem from the fact that for each anchor there could be multiple menus and the current code doesn't account for that. For example, swapping context menus on a tab doesn't register change listeners on the new context menu because the TabPane itself had a scene change listener already. These other issues could relate to JDK-8268374 https://bugs.openjdk.org/browse/JDK-8268374 and JDK-8283449 https://bugs.openjdk.org/browse/JDK-8283449. One of the issues is related to the fact that there's no logic to remove listeners when Tab/TableColumn's are removed from their associated control (TabPane, TableView, TreeTableView).
>>
>> I'm looking at these issues, but I think they're dependent on this fix. Either I can add to this PR or I can wait to see what comes out of this and fix them subsequently.
>
> Dean Wookey has updated the pull request incrementally with one additional commit since the last revision:
>
> Added more comments and fixed IdentityWrapper hashcode.
This is what I'd like to do to fix JDK-8268374 and JDK-8283449 as well as an unreported bug where multiple tabs with context menus wouldn't register/remove accelerators properly. It also refactors the methods so that there are 3 public add methods and 3 public remove methods, and for every private add/install method there is a private remove/uninstall method that reverses it. I'm not really sure of the best way of tackling this. Whether to try break to separate the fixes for each of those bugs into their own PR, or do it in one go.
https://github.com/openjdk/jfx/commit/25d98afc5869d013eed830ed7c370d06bd495056
-------------
PR: https://git.openjdk.org/jfx/pull/1037
More information about the openjfx-dev
mailing list