JavaFX:阶段和控制器生命周期...内存管理

JavaFX: Stage and Controller lifecycle...memory management

我想知道即时创建的阶段和控制器(不是扩展应用程序的主要阶段)的生命周期是什么,或者换句话说,任何 child window 产生的另一个 window。我担心任何内存泄漏,我只是想确保我正在构建 memory/resource 高效的 GUI 应用程序。这是一个示例代码:

private void addNewAsset(ActionEvent event) {
    AssetController assetController = new AssetController();
    FXMLLoader loader = new FXMLLoader(getClass().getResource("assetchooser.fxml"));
    loader.setController(assetController);

    Stage assetChooserStage = new Stage();
    assetChooserStage.initModality(Modality.WINDOW_MODAL);
    assetChooserStage.initOwner(listviewAssets.getScene().getWindow());
    assetChooserStage.setTitle("Choose Asset(s)");
    try {
        assetChooserStage.setScene(new Scene((Parent)loader.load()));
    } catch (IOException e) {
        e.printStackTrace();
    }

    assetChooserStage.show();
    assetChooserStage.setOnCloseRequest((windowEvent)->{
        //DO STUFF: Get any data
        List<AssetChosenData> listAssets = assetController.getListAssetChosen();

        System.out.println("CLOSING");}
    );
}

如您所见,addNewAsset() 方法在用户单击某个按钮时执行。该方法使用 FXMLLoader 和控制器生成一个新的 Stage。当这个阶段关闭时(setOnCloseRequest),我捕获我想要的数据。之后会发生什么? controller(AssetController)和Stage(assetChooserStage),以及它们使用的所有Controls和data,会不会被设置为null,然后GC来处理它们?

如果您不知道具体细节,也许您可​​以向我指出处理此主题的官方 Java/Oracle 文档。

谢谢。

这只是默认的 Java 行为:

您正在创建对象,如果您不再保留对它们的(强)引用,它们将被垃圾收集。

在您的情况下,您仅在本地范围(方法)中创建对象,并且不存储任何其他对象。

何时以及是否对 Stage 进行垃圾回收是我们无法触及的实现细节。如果您认为存在内存泄漏,您应该在 JavaFX tracker.

中提交问题