【问题标题】:JavaFX: Stage and Controller lifecycle...memory managementJavaFX:阶段和控制器生命周期...内存管理
【发布时间】:2015-01-21 15:30:40
【问题描述】:

我想知道动态创建的阶段和控制器的生命周期(不是扩展应用程序的主窗口),或者换句话说,从另一个窗口产生的任何子窗口。我担心任何内存泄漏,我只想确保我正在构建内存/资源高效的 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 和控制器生成一个新阶段。当这个阶段关闭时(setOnCloseRequest),我捕获了我想要的数据。之后会发生什么?控制器(AssetController)和Stage(assetChooserStage),以及它们使用的所有Controls和数据,是否会被设置为null,稍后GC来处理它们?

如果你不知道具体细节,也许你可以给我指出一个处理这个主题的官方 Java/Oracle 文档。

谢谢。

【问题讨论】:

    标签: java performance memory memory-leaks javafx


    【解决方案1】:

    这只是默认的 Java 行为:

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

    在您的情况下,您仅在本地范围(方法)中创建对象,否则不要存储任何对象。

    Stage 何时以及是否被垃圾回收是我们无法实现的实现细节。如果您认为存在内存泄漏,您可能应该在JavaFX tracker 中提出问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 2016-11-05
      • 2011-06-27
      相关资源
      最近更新 更多