[英]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.