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 <[email protected]> on behalf of Thiago Milczarek
Sayão <[email protected]>
Date: Thursday, April 18, 2024 at 03:42
To: openjfx-dev <[email protected]>
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.