Problem with Timeline keeping references around
Stephen F Northover
steve.x.northover at oracle.com
Tue Oct 15 15:47:51 PDT 2013
This looks like a bug. Timeline should not be holding on to
references. Please enter a JIRA.
Steve
On 2013-10-15 6:35 PM, John Hendrikx wrote:
> Hi List,
>
> I just submitted https://javafx-jira.kenai.com/browse/RT-33600 which
> is asking for the Timeline JavaDocs to be more clear on when and where
> hard references are being created and how to properly clean up after
> oneself. Most of the docs hardly mention anything when it comes to
> references causing memory leaks, and Timeline is no exception.
>
> However, apart from the docs not really discussing this topic, I
> actually cannot get proper cleanup to work at all when working with a
> Timeline.
>
> If my Timeline is referencing properties from a StackPane and the
> Timeline was run atleast once, I cannot figure out how to get this
> Pane to be gc'd. Calling stop() and even doing getKeyFrames().clear()
> doesn't help. I'm sure it must be the Timeline because if I remove
> the KeyFrames that access the StackPane, it will get gc'd properly.
> If I never run the animation, it also gets gc'd properly.
>
> See code below. The System.outs will occur exactly as expected when
> the StackPane becomes part of the Scene and when it is removed from
> the Scene. I call stop() on my Timeline and even clear its KeyFrames,
> but the StackPane refuses to be gc'd (even after hitting the GC button
> I created for this occasion dozens of times).
>
> Not calling playFromStart() or not using the KeyFrames that refer to
> detailsOverlay.opacityProperty() will solve the problem, and the
> finalize() System.out will occur usually after the first or second
> time I press my GC button.
>
> Anything else I can try or is this a bug?
> --John
>
> public class PlaybackOverlayPane extends StackPane {
> private final Timeline fadeInSustainAndFadeOut = new Timeline(
> new KeyFrame(Duration.seconds(0)),
> new KeyFrame(Duration.seconds(1), new
> KeyValue(detailsOverlay.opacityProperty(), 1.0)),
> new KeyFrame(Duration.seconds(6), new
> KeyValue(detailsOverlay.opacityProperty(), 1.0)),
> new KeyFrame(Duration.seconds(9), new
> KeyValue(detailsOverlay.opacityProperty(), 0.0))
> );
>
> private final ChangeListener<Scene> sceneChangeListener = new
> ChangeListener<Scene>() {
> @Override
> public void changed(ObservableValue<? extends Scene> observable,
> Scene oldValue, Scene newValue) {
> if(newValue != null) {
> System.out.println(">>> Starting fadeIn anim");
> fadeInSustainAndFadeOut.playFromStart();
> }
> else {
> System.out.println(">>> Stopping fadeIn anim");
> fadeInSustainAndFadeOut.stop();
> fadeInSustainAndFadeOut.getKeyFrames().clear();
> fadeInSustainAndFadeOut.stop();
> }
> }
> };
>
> private final GridPane detailsOverlay = GridPaneUtil.create(new
> double[] {5, 20, 5, 65, 5}, new double[] {45, 50, 5});
>
> ...
>
> @Override
> protected void finalize() throws Throwable {
> super.finalize();
> System.out.println(">>> Finalized " + this);
> }
> }
More information about the openjfx-dev
mailing list