[EXTERNAL] Memory leak in JavaFX 8 when changing skins
David Grieve
David.Grieve at microsoft.com
Thu Jan 9 13:58:20 UTC 2020
Possible workarounds would be to use Control.setSkin instead of -fx-skin, or to bind the skin property after it has been set to something other than the default. CSS should not mess with a bound property.
> -----Original Message-----
> From: openjfx-dev <openjfx-dev-bounces at openjdk.java.net> On Behalf Of
> Adam Granger
> Sent: Thursday, January 9, 2020 3:04 AM
> To: openjfx-dev at openjdk.java.net
> Subject: [EXTERNAL] Memory leak in JavaFX 8 when changing skins
>
>
> 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_REQUESTE
> D,
> 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