Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.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
windows而非mac osx中的JavaFx内存泄漏_Java_Javafx 2 - Fatal编程技术网

windows而非mac osx中的JavaFx内存泄漏

windows而非mac osx中的JavaFx内存泄漏,java,javafx-2,Java,Javafx 2,当使用-Xmx10m jvm选项执行时,我有以下javafx代码,在mac osx上单击按钮(添加和删除250个文本字段100000次)后,它运行到完成,但在windows 7上内存不足 在这两个平台上,都使用了Java1.7.0U25 import java.util.ArrayList; import java.util.List; import javafx.application.Application; import javafx.event.ActionEvent; import

当使用-Xmx10m jvm选项执行时,我有以下javafx代码,在mac osx上单击按钮(添加和删除250个文本字段100000次)后,它运行到完成,但在windows 7上内存不足

在这两个平台上,都使用了Java1.7.0U25

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);
    }
}
import java.util.ArrayList;
导入java.util.List;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.control.Button;
导入javafx.scene.control.Label;
导入javafx.scene.control.TextField;
导入javafx.scene.layout.VBox;
导入javafx.stage.stage;
公共类SimpleTextFieldTest扩展了应用程序{
私有列表=新的ArrayList();
私有标签消息=新标签();
私有void init(阶段primaryStage){
System.out.println(“开始测试”);
对于(int i=0;i<250;i++){
TextField TextField=新的TextField();
textField.setPrefWidth(100);
setText(“你好”);
list.add(textField);
}
System.out.println(“初始文本框的结尾”);
最终VBox根=新VBox();
原始阶段。设置场景(新场景(根,200200));
Button button1=新按钮();
按钮1.setText(“开始”);
button1.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent arg0){
试一试{
对于(int i=0;i<100000;i++){
用于(文本字段文本:列表){
root.getChildren().add(文本);
}
root.getChildren().removeAll(列表);
}
}捕获(例外情况除外){
例如printStackTrace();
}
System.out.println(“测试结束”);
}
});
root.getChildren().add(按钮1);
root.getChildren().add(消息);
}
@凌驾
public void start(Stage primaryStage)引发异常{
初始阶段;
primaryStage.show();
}
公共静态void main(字符串[]args){
发射(args);
}
}

内存不足并不总是意味着内存泄漏。这可能仅仅意味着你没有足够的内存去做你想做的事情。10梅格一点也不多。在Mac和Windows之间,JavaFX节点的内存表示可能有所不同,可能Windows表示需要更多的空间,或者从Windows开始,内存池的基本消耗更高。一句话:期望跨平台的内存使用完全相同是不现实的。而且,-Xmx选项本身的实现甚至可能有所不同


在浏览了您的代码之后,我没有发现任何泄漏,特别是因为您没有每次实例化新的TextField实例。是的,在Java中泄漏内存是非常非常有可能的。在某些方面,这几乎更可能是因为它给了你一种错误的安全感。

什么是内存泄漏?Java会有内存泄漏吗?@RomanC我想应该是@Sky那么,内存泄漏在哪里?@RoamnC不确定在这里,但是要回答您关于“Java会有内存泄漏吗?”的一般性问题,答案是肯定的。