RFR: 8295754: PaginationSkin: memory leak when changing skin

Kevin Rushforth kcr at openjdk.org
Mon Nov 28 17:26:45 UTC 2022


On Thu, 20 Oct 2022 20:48:07 GMT, Andy Goryachev <angorya at openjdk.org> wrote:

> Fixes memory leaks as determined by SkinMemoryLeakTest (remove line 171) and a leak tester
> https://github.com/andy-goryachev-oracle/Test/blob/main/src/goryachev/apps/LeakTest.java
> 
> Make sure to configure the current test in LeakTest:
> protected final Type WE_ARE_TESTING = Type.PAGINATION;
> 
> Found another issue: Pagination class does not survive replacing its skin (all components disappear).
> 
> caused by:
> - adding and not removing listeners
> - adding and not removing children Nodes
> - setting control's properties in the constructor
> - incorrectly setting a clip rectangle
> 
> NOTE: the fix will requires both ListenerHelper [JDK-8294809](https://bugs.openjdk.org/browse/JDK-8294809) and Skin.install() [JDK-8290844](https://bugs.openjdk.org/browse/JDK-8290844) changes.

I looked at this in connection with PR #908 . It generally looks good. I left a few questions.

modules/javafx.controls/src/main/java/javafx/scene/control/skin/PaginationSkin.java line 201:

> 199:         getChildren().addAll(currentStackPane, nextStackPane, navigation);
> 200: 
> 201:         ListenerHelper.get(this).addInvalidationListener(getSkinnable().maxPageIndicatorCountProperty(), (o) -> {

Minor: In the constructor, I recommend using the `control` argument rather than calling `getSkinnable()`, although this is just a recommendation.

Minor: since you make several calls to `ListenerHelper`, a temporary variable might make the code simpler; this is also just a recommendation.

modules/javafx.controls/src/main/java/javafx/scene/control/skin/PaginationSkin.java line 209:

> 207:         });
> 208: 
> 209:         ListenerHelper.get(this).addChangeListener(getSkinnable().heightProperty(), true, (ev) -> {

Why does `fireImmediately` need to be true?

modules/javafx.controls/src/main/java/javafx/scene/control/skin/PaginationSkin.java line 1361:

> 1359:             // FIX own listener helper?
> 1360:             //getSkinnable().getStyleClass().removeListener(updateSkinIndicatorType);
> 1361:             //tooltipVisibleProperty().removeListener(updateTooltipVisibility);

I don't quite understand the comment. What follow-up is needed?

modules/javafx.controls/src/test/java/test/javafx/scene/control/skin/SkinMemoryLeakTest.java line 171:

> 169:                 MenuBar.class,
> 170:                 MenuButton.class,
> 171:                 //Pagination.class,

I would just remove this (which was done for other classes once the leaks were fixed).

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

PR: https://git.openjdk.org/jfx/pull/925


More information about the openjfx-dev mailing list