gpt4 book ai didi

java - RAM 过度支出 - JavaFX

转载 作者:行者123 更新时间:2023-11-29 09:26:47 25 4
gpt4 key购买 nike

在每次场景切换时,内存的使用都会增加并且永远不会“清理”,如果我来回通过 2 个屏幕,同样的情况会发生几次,每次我进入同一个屏幕都会增加使用,只有我们可以看到使用减少的第二个屏幕的第一个屏幕在图形中以红色标记。

enter image description here

注意垃圾收集只会增加:

enter image description here

要更改场景,我使用以下代码:

public void changeStage(Parent event, String title, String url){
Platform.runLater(() -> {
try {
Parent loader = FXMLLoader.load(getClass().getResource("/gro/admin/java/" + url));
event.getScene().setRoot(loader);

} catch (IOException ex) {
Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);

}
});
}

搜索后我看到了 System.gc();可以帮助但没有效果。我试图让所有对象都变为 null 并调用它来尝试释放 RAM 但没有效果:

调用changeStage(this, stackPane, "Title", "Url"); , <强> This在这种情况下是实现 Initializable 的类本身

public void changeStage(Object obj, Parent event, String title, String url){
Platform.runLater(() -> {
try {
nullAll(obj, event);
Parent loader = FXMLLoader.load(getClass().getResource("/gro/admin/java/" + url));
event.getScene().setRoot(loader);

} catch (IOException ex) {
Logger.getLogger(LoginController.class.getName()).log(Level.SEVERE, null, ex);

}
});
}

private static void nullAll(Object obj, Parent root){
ObservableList<Node> nodes = getAllViews(root);
nodes.forEach(node -> node = null);
nodes.clear();
nodes = null;
if(root instanceof StackPane){
((StackPane) root).getChildren().clear();
root = null;

}else{
root = null;

}

obj = null;
System.gc();
}

private static ObservableList<Node> getAllViews(Parent root) {
ObservableList<Node> nodes = FXCollections.observableArrayList();
addAllDescendents(root, nodes);
return nodes;
}

private static void addAllDescendents(Parent parent, ObservableList<Node> nodes) {
parent.getChildrenUnmodifiable().stream().map((node) -> {
nodes.add(node);
return node;
}).map((node) -> {
if (node instanceof Parent){
addAllDescendents((Parent) node, nodes);

}
return node;
}).map((node) -> {
if(node instanceof ScrollPane){
addAllDescendents((Parent) ((ScrollPane) node).getContent(), nodes);
nodes.add(((ScrollPane) node).getContent());
}
return node;
}).map((node) -> {
if(node instanceof TabPane){
((TabPane) node).getTabs().forEach((t) -> {
addAllDescendents((Parent) ((Tab) t).getContent(), nodes);
});
}
return node;
}).filter((node) -> (node instanceof JFXTabPane)).forEachOrdered((node) -> {
((JFXTabPane) node).getTabs().forEach((t) -> {
addAllDescendents((Parent) ((Tab) t).getContent(), nodes);
});
});
}

这并没有影响到内存中的任何东西,只是让场景的交流“哽咽”了一些。

有谁知道在没有这种不必要的“堆积”的情况下我实际上可以如何改变场景?

编辑:啊,还有一个有趣的地方,这个使用过程中内存的使用从 1gb 开始很容易,但是如果我使用一些 ram 清理程序,它会低于 100mb。

之前:

enter image description here

之后:

enter image description here

最佳答案

长历史短:这与您的代码无关,而与 Java 的工作方式有关。JavaFX 通常需要更多内存,它会根据需要消耗更多内存,因为默认情况下,即使您触发垃圾回收,Java 也不会将内存返回给您的系统,因此如果 JavaFX 程序需要大量内存来处理但释放之后,JRE 将永远保持最高级别的内存,并且垃圾收集器的触发频率将降低,因为有太多未使用的空闲内存,但是,您可以更改 JVM 行为,内存分配方式,内存分配方式释放并触发 GC 时,请参阅 Performance Tuning Guide

关于java - RAM 过度支出 - JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55184198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com