Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javafxgui不';t释放存储器_Java_Memory_Memory Management_Memory Leaks_Javafx - Fatal编程技术网

javafxgui不';t释放存储器

javafxgui不';t释放存储器,java,memory,memory-management,memory-leaks,javafx,Java,Memory,Memory Management,Memory Leaks,Javafx,为了解决JavaFX应用程序中的内存泄漏问题,我已经苦苦挣扎了几个星期,今天我觉得自己完全不知所措,所以决定编写一个我能想到的最简单的应用程序,以证明JavaFX实际上可以释放内存,从而证明我做错了什么。令我惊讶的是,这似乎也泄露了记忆 有人能告诉我为什么在点击按钮后,下面的应用程序堆中仍然有一个javafx.scene.control.Label?我检查它的方式是在jprofiler那里 public class MemoryTestApplication extends Applicatio

为了解决JavaFX应用程序中的内存泄漏问题,我已经苦苦挣扎了几个星期,今天我觉得自己完全不知所措,所以决定编写一个我能想到的最简单的应用程序,以证明JavaFX实际上可以释放内存,从而证明我做错了什么。令我惊讶的是,这似乎也泄露了记忆

有人能告诉我为什么在点击按钮后,下面的应用程序堆中仍然有一个
javafx.scene.control.Label
?我检查它的方式是在jprofiler那里

public class MemoryTestApplication extends Application {

    @Override
    public void start(Stage primaryStage) {
        //root pane
        final VBox root = new VBox();

        //label to remove when button is clicked
        final Label label = new Label("Remove Me");
        root.getChildren().add(label);

        //button to remove label
        Button btn = new Button("Remove label");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                root.getChildren().remove(label);
            }
        });
        root.getChildren().add(btn);

        //create scene and stage
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
公共类MemoryStatApplication扩展了应用程序{
@凌驾
公共无效开始(阶段primaryStage){
//根窗格
最终VBox根=新VBox();
//单击按钮时要删除的标签
最终标签=新标签(“删除我”);
root.getChildren().add(标签);
//移除标签的按钮
按钮btn=新按钮(“移除标签”);
btn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
root.getChildren().remove(标签);
}
});
root.getChildren().add(btn);
//创造场景和舞台
场景=新场景(根);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

事件处理程序的匿名内部类包含对标签的引用,而按钮包含对事件处理程序的引用

匿名内部类将有两个合成生成的字段,由编译器创建,如:

final Label val$label;
final MemoryTestApplication this$0;
因为这些是最终的,所以在使用标签后,您不能通过
label=null清除标签,因此我认为最好将事件处理程序更改为普通的命名类,将标签引用传递给其构造函数,然后在使用它从布局中删除标签后清除它。(您需要在删除之前测试它是否为空,以便只有在第一次按下按钮时才会删除它)