[External] : Re: Possible leak on setOnAction

Andy Goryachev andy.goryachev at oracle.com
Thu Apr 18 16:11:46 UTC 2024


Well, then all these setOnXXX() should mention it as well, wouldn't you say?

Perhaps a better solution might be a general purpose tutorial which addresses the common pitfalls like memory leaks, and new features like Subscription.

We do have these tutorials for java8 -

https://docs.oracle.com/javase/8/javafx/events-tutorial/events.htm

But since JavaFX has been decoupled from the JDK we don't seem to have anything more recent.  I don't know whether this situation is going to change any time soon.

-andy


From: Thiago Milczarek Sayão <thiago.sayao at gmail.com>
Date: Thursday, April 18, 2024 at 08:51
To: Andy Goryachev <andy.goryachev at oracle.com>
Cc: openjfx-dev <openjfx-dev at openjdk.org>
Subject: [External] : Re: Possible leak on setOnAction
I was investigating,

It probably should be menuItem.setOnAction(new WeakEventHandler<>(e -> stage.toFront()));

But I bet it's a common mistake. Maybe the setOnAction should mention it?



Em qui., 18 de abr. de 2024 às 11:54, Andy Goryachev <andy.goryachev at oracle.com<mailto:andy.goryachev at oracle.com>> escreveu:
You are correct - the lambda strongly references `stage` and since it is in turn is strongly referenced from the menu item it creates a leak.

The lambda is essentially this:

menuItem.setOnAction(new H(stage));
class $1 implements EventHandler<ActionEvent> {
  private final Stage stage;
  public $1(Stage s) {
    this.stage = s; // holds the reference and causes the leak
  }
  public void handle(ActionEvent ev) {
    stage.toFront();
  }
}

-andy

From: openjfx-dev <openjfx-dev-retn at openjdk.org<mailto:openjfx-dev-retn at openjdk.org>> on behalf of Thiago Milczarek Sayão <thiago.sayao at gmail.com<mailto:thiago.sayao at gmail.com>>
Date: Thursday, April 18, 2024 at 03:42
To: openjfx-dev <openjfx-dev at openjdk.org<mailto:openjfx-dev at openjdk.org>>
Subject: Possible leak on setOnAction
Hi,

I'm pretty sure setOnAction is holding references.

I have a "Open Windows" menu on my application where it lists the Stages opened and if you click, it calls stage.toFront():

menuItem.seOnAction(e -> stage.toFront())

I had many crash reports, all OOM. I got the hprof files and analyzed them - turns out this was holding references to all closed stages.

To fix it, I call setOnAction(null) when the stage is closed.

I will investigate further and provide an example.

-- Thiago.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20240418/9e53dcab/attachment.htm>


More information about the openjfx-dev mailing list