我创建了一个引发内存泄漏的示例应用程序。
问题是我需要“重新加载”场景。如果我有两个场景(Bar和Foo),每个场景一个按钮(ButtonBar和ButtonFoo),按钮会改变当前场景,创建一个新场景。 如果我按住ButtonBar和ButtonFoo 5分钟(或更短),那么这个简单程序的内存消耗会越来越高。
Bar.java
public class Bar implements Initializable {
@FXML
private Label label;
@FXML
private void toFoo(ActionEvent event) {
try {
Button button = (Button) event.getSource();
Parent root = FXMLLoader.load(getClass().getResource("Foo.fxml"));
Stage currentStage = (Stage) button.getScene().getWindow();
currentStage.setScene(new Scene(root));
} catch (IOException ex) {
Logger.getLogger(Bar.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void initialize(URL url, ResourceBundle rb) {
// TODO
}
}
Foo.java与更改de fxml加载相同。
fxml只包含一个按钮:
<Button id="buttonBar" layoutX="126" layoutY="90" text="Bar!" onAction="#toFoo" fx:id="buttonBar" />
是否存在真正的内存泄漏问题?有谁知道另一种方法吗?我希望这个应用程序能够保持活力并永远地进行更改,就像服务一样。 感谢
答案 0 :(得分:1)
我遇到了类似的问题。
当我在场景上移动鼠标时。内存使用量增加,从不下降。
我相信这与鼠标事件有关。
祝你好运!
答案 1 :(得分:1)
我不确定内存泄漏,但出于性能原因,我会避免重复加载资源。
我所做的是将变量中的父Parent保存到场景中,或者根据需要将其添加到另一个场景的特定部分,通过控制器类的静态方法更新值。
我有几个预加载的场景,每次用户从列表中选择某些值时,都会更新一个更大场景的一部分。
答案 2 :(得分:1)
我建议你试试FX8。已经有一些针对内存泄漏的修复程序。
如果您无法更新到最新版本的JavaFX,我建议您不要在FXML中使用onAction="#toFoo"
。
相反,声明一个事件处理程序并调用以下内容:buttonBar.addEventHandler(MouseEvent.MOUSE_CLICKED, declaredEventHandler);
。
在退出当前屏幕之前释放事件处理程序:buttonBar.removeEventHandler(declaredEventHandler);