当使用-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);
}
}
答案 0 :(得分:0)
耗尽内存并不总意味着内存泄漏。这可能只是意味着你没有足够的记忆去做你想做的事情。 10兆不是很多。 JavaFX节点的内存中表示可能在Mac和Windows之间有所不同,并且可能Windows表示需要更多空间,或者在Windows上开始使用内存池的基本消耗较高。结论:期望跨平台使用完全相同的内存使用是不现实的。此外,-Xmx选项本身的实现可能会有所不同。
在仔细查看代码后,我没有看到任何泄漏,特别是因为您每次都没有实例化新的TextField实例。是的,在Java中泄漏内存是非常非常可能的。在某些方面,它几乎更有可能,因为它会给你一种虚假的安全感。