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.
中提交问题
我想知道即时创建的阶段和控制器(不是扩展应用程序的主要阶段)的生命周期是什么,或者换句话说,任何 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.