簡體   English   中英

Windows中的JavaFx內存泄漏,但Mac OSX中沒有

[英]JavaFx memory leak in windows but not mac osx

使用-Xmx10m jvm選項執行時,我具有以下javafx代碼,在Mac OS X上單擊按鈕(它會添加和刪除250個TextField 100000次)后運行完成,但在Windows 7上內存不足。

在兩個平台上,均使用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);
    }
}

內存不足並不總是意味着內存泄漏。 這可能只是意味着您沒有足夠的內存來執行您要嘗試執行的操作。 10兆根本不算什么。 在Mac和Windows之間,JavaFX節點的內存表示形式可能有所不同,並且Windows表示形式可能需要更多空間,或者從Windows開始,內存池的基本消耗會更高。 底線:跨平台使用完全相同的內存使用是不現實的。 同樣,-Xmx選項本身的實現甚至可能不同。

看完您的代碼后,我看不到任何泄漏,尤其是因為您沒有每次都實例化新的TextField實例。 是的,在Java中非常有可能泄漏內存。 在某些方面,它更有可能是因為它給您帶來了錯誤的安全感。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM