Memory leak in JavaFX 8 when changing skins
Adam Granger
adam at adamish.com
Thu Jan 9 08:04:07 UTC 2020
Greetings,
I realise this is now legacy for most people but we still widely use
JavaFX 8.
I appear to have discovered a memory leak when skin is changed
The constructor
com.sun.javafx.scene.control.skin.BehaviorSkinBase.BehaviorSkinBase
adds an event listener
control.addEventHandler(ContextMenuEvent.CONTEXT_MENU_REQUESTED,
contextMenuHandler);
However this is never removed in the dispose() which prevents garbage
collection of the previous skin.
This problem is amplified by fact JavaFX appears to reload skins
unnecessarily in a complex use case involving JFXPanel - I've as-yet
been unable to produce a SSCCE for this
What I've discovered so far
- CSS is reprocessed
- javafx.scene.CssStyleHelper.canReuseStyleHelper(Node, StyleMap)
returns false
- node.styleHelper.resetToInitialValues(node); is called which then
causes the "stock" skin load
- custom skin (-fx-skin in our application CSS) is then loaded
- stock skin cannot be GC'd and neither can our custom skin
- appears to affect any subclass of BehaviorSkinBase
Please could you confirm my analysis of this problem and suggest any
workarounds?
Regards,
Adam
More information about the openjfx-dev
mailing list