Possible leak on setOnAction

Thiago Milczarek Sayão thiago.sayao at gmail.com
Thu Apr 18 15:50:54 UTC 2024


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> 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> on behalf of Thiago
> Milczarek Sayão <thiago.sayao at gmail.com>
> *Date: *Thursday, April 18, 2024 at 03:42
> *To: *openjfx-dev <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/1ea32911/attachment-0001.htm>


More information about the openjfx-dev mailing list