RFR: 8208088: Memory Leak in ControlAcceleratorSupport

Ambarish Rapte arapte at openjdk.java.net
Wed Mar 17 17:40:02 UTC 2021


The method `ControlAcceleratorSupport.doAcceleratorInstall(final List<? extends MenuItem> items, final Scene scene)` adds a `ChangeListener` on `MenuItem.acceleratorProperty()`. This listener is not removed when the MenuItem is removed from scenegraph.
Adding and removing a MenuItem results in multiple copies of the listener added to MenuItem.acceleratorProperty().

Fix is to remove the listener when MenuItem is removed.
Fix can be verified by checking the number of instances of `ControlAcceleratorSupport.lambda` using _jvisualvm_. 
Without this fix, the number of `ControlAcceleratorSupport.lambda` increase in multiple of number of MenuItems being removed and added back.
With fix, the count is always same as number of MenuItems in scenegraph.

Also there is another ListChangeListener added to a `ObservableList<MenuItem> items` in the method `ControlAcceleratorSupport.doAcceleratorInstall(final ObservableList<MenuItem> items, final Scene scene)`. There was a TODO note to remove this listener.
This listener is added on `MenuBarButton.getItems()` and not on `Menu.getItems()`.  This `MenuBarButton` is created by `MenuBarSkin` to show a `Menu`. This `MenuBarButton` gets disposed when the related `Menu` is removed from scenegraph, and so the added `ListChangeListener` gets GCed. Hence it is not required to explicitly remove the listener. 
Added a comment explaining this behavior in place of the TODO.

-------------

Commit messages:
 - remove listener added to MenuItem from ControlAcceleratorSupport

Changes: https://git.openjdk.java.net/jfx/pull/429/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jfx&pr=429&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8208088
  Stats: 46 lines in 1 file changed: 34 ins; 10 del; 2 mod
  Patch: https://git.openjdk.java.net/jfx/pull/429.diff
  Fetch: git fetch https://git.openjdk.java.net/jfx pull/429/head:pull/429

PR: https://git.openjdk.java.net/jfx/pull/429


More information about the openjfx-dev mailing list