Windows中的JavaFx内存泄漏但不是mac osx

时间:2014-06-09 07:59:19

标签: java javafx-2

当使用-Xmx10m jvm选项执行时,我有以下javafx代码,它在mac osx上单击按钮(它添加并删除250个TextFields 100000次)后运行完成但是在Windows 7上内存不足。 / p>

在两个平台上都使用了java 1.7.0 u25。

import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class SimpleTextFieldTest extends Application {

    private List<TextField> list = new ArrayList<TextField>();
    private Label message = new Label();

    private void init(Stage primaryStage) {

        System.out.println("Start Testing");
        for (int i = 0; i < 250; i++) {
            TextField textField = new TextField();
            textField.setPrefWidth(100);
            textField.setText("hello");
            list.add(textField);
        }
        System.out.println("end of initial textBox");

        final VBox root = new VBox();
        primaryStage.setScene(new Scene(root, 200, 200));

        Button button1 = new Button();
        button1.setText("Start");
        button1.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {

                try{
                    for (int i = 0; i < 100000; i++) {

                        for(TextField text : list){
                            root.getChildren().add(text);
                        }

                        root.getChildren().removeAll(list);
                    }
                }catch(Exception ex){
                    ex.printStackTrace();
                }

                System.out.println("end of Test");
            }
        });
        root.getChildren().add(button1);
        root.getChildren().add(message);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

1 个答案:

答案 0 :(得分:0)

耗尽内存并不总意味着内存泄漏。这可能只是意味着你没有足够的记忆去做你想做的事情。 10兆不是很多。 JavaFX节点的内存中表示可能在Mac和Windows之间有所不同,并且可能Windows表示需要更多空间,或者在Windows上开始使用内存池的基本消耗较高。结论:期望跨平台使用完全相同的内存使用是不现实的。此外,-Xmx选项本身的实现可能会有所不同。

在仔细查看代码后,我没有看到任何泄漏,特别是因为您每次都没有实例化新的TextField实例。是的,在Java中泄漏内存是非常非常可能的。在某些方面,它几乎更有可能,因为它会给你一种虚假的安全感。