windows而非mac osx中的JavaFx内存泄漏
当使用-Xmx10m jvm选项执行时,我有以下javafx代码,在mac osx上单击按钮(添加和删除250个文本字段100000次)后,它运行到完成,但在windows 7上内存不足 在这两个平台上,都使用了Java1.7.0U25windows而非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
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会有内存泄漏吗?”的一般性问题,答案是肯定的。