首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我的java应用程序中有内存泄漏吗?

我的java应用程序中有内存泄漏吗?
EN

Stack Overflow用户
提问于 2014-03-25 14:13:47
回答 1查看 505关注 0票数 0

新增资料:

在JDialog的帮助下,我尝试了很多东西来摆脱a helpful topic (请参阅下面的完整信息)。在本主题的最后一个答案中,我重新编写了代码,添加了一个propertyChangeListener,这在我的实际代码中似乎是问题所在:

运行,重新加工代码1:

代码语言:javascript
复制
import java.awt.Dialog;
import java.awt.Dimension;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.Timer;

public class RemoveDialogOnruntimeListener extends JFrame {

private static final long serialVersionUID = 1L;
private boolean runProcess;
private int maxLoop = 0;
private Timer timer;
private JOptionPane optionpane;
private JDialog dialog;

public RemoveDialogOnruntimeListener() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setPreferredSize(new Dimension(300, 300));
    setTitle("Remove Dialog On Runtime");
    setLocation(150, 150);
    pack();
    setVisible(true);
    addNewDialog();
}

private void addNewDialog() {
    this.optionpane = new JOptionPane();
    this.dialog = optionpane.createDialog("Foo");
    dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    dialog.setModalityType(Dialog.ModalityType.MODELESS);
    dialog.setVisible(true);
    this.optionpane.addPropertyChangeListener(new PropertyChangeListener() {

        @Override
        public void propertyChange(PropertyChangeEvent evt) {
//              Object obj = evt.getNewValue();
//              System.out.println("----");
//              System.out.println(obj);
            RemoveDialogOnruntimeListener.this.optionpane = null;
            RemoveDialogOnruntimeListener.this.dialog = null;
            remWins();      
            }

        });
    }




private void remWins() {
    runProcess = true;
    timer = new Timer(1000, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            if (runProcess) {
                for (Window win: Window.getWindows()) {
                    if (win instanceof JDialog) {
                        System.out.println("    Trying to Remove JDialog");
                        win.dispose();
                    }
                }
                System.out.println("    Remove Cycle Done :-)");
                runProcess = false;
                new Thread() {
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        Runtime.getRuntime().gc();
                    }
                }.start();
            } else {
                if(maxLoop>=2){
                    timer.stop();
                } else {
                    pastRemWins();
                    runProcess = true;
                }

            }
        }
    });
    timer.setRepeats(true);
    timer.start();
}

private void pastRemWins() {
    maxLoop++;
    System.out.println("    Checking if still exists any of TopLayoutContainers");
    Window[] wins = Window.getWindows();
    for (int i = 0; i < wins.length; i++) {
        if (wins[i] instanceof JFrame) {
            System.out.println("JFrame");
        } else if (wins[i] instanceof JDialog) {
            System.out.println("JDialog");
        } else {
            System.out.println(wins[i].getClass().getSimpleName());
        }
    }
    // We must expect 2 windows here: this (RemoveDialogOnRuntime) and the parent of all parentless dialogs
    if (wins.length > 2) {
        wins = null;

        if (maxLoop <= 3) {
            System.out.println("    Will Try Remove Dialog again, CycleNo. " + maxLoop);
            System.out.println(" -----------------------------------------------------------");
            remWins();
        } else {
            System.out.println(" -----------------------------------------------------------");
            System.out.println("*** End of Cycle Without Success, Exit App ***");
            closeMe();
        }
    } else {
        timer.stop();
    }
}

private void closeMe() {
    System.exit(0);
}


public static void main(String args[]) {
    RemoveDialogOnruntimeListener superConstructor = new RemoveDialogOnruntimeListener();

}
}

在本例中,随着侦听器的使用,JDialog仍将被删除。我试着在相关代码中与实际的类一起工作,如下所示:

代码语言:javascript
复制
public class DeleteInsideBox3DDialog {

    Visu3DDeleteInsideBox visu;
    JFormattedTextField xCoord,yCoord,zCoord;
    SimpleTree simpleTree;
    List<Point3D> lastDeleted;
    Object[] options;
    JDialog dialog;
    JOptionPane optionPane;
     private boolean runProcess;
        private int maxLoop = 0;
        private Timer timer;

    public DeleteInsideBox3DDialog(SimpleTree simpleTree, Visu3DDeleteInsideBox visu) {
        this.simpleTree = simpleTree;
        this.visu = visu;
        this.lastDeleted = new ArrayList<Point3D>();
        this.options = new String[] { "Done" };
        Object complexMsg[] = { centerXPanel(),centerYPanel(),centerZPanel()
                ,dimXPanel(),dimYPanel(),dimZPanel()
                ,deleteButtonPanel(),undeleteButtonPanel() };
        this.optionPane = new JOptionPane();

        this.optionPane.setMessage(complexMsg);
        this.optionPane.setOptions(this.options);
        this.optionPane.setMessageType(JOptionPane.PLAIN_MESSAGE);
//          this.dialog = this.optionPane.createDialog(this.simpleTree.getGui()
//                  .getMonitor().getSelectedComponent(),
//                  "Delete Points contained in a box");
            this.dialog = this.optionPane.createDialog("Delete Points contained in a box");
            this.dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.dialog.setModalityType(Dialog.ModalityType.MODELESS);
//      this.dialog.setSize(800, 400);
        this.dialog.setVisible(true);
        this.dialog.setVisible(false);
        this.dialog.setVisible(true);
        this.dialog.pack();
        this.optionPane.addPropertyChangeListener(new PropertyChangeListener() {

            @Override
            public void propertyChange(PropertyChangeEvent evt) {
                Object obj = evt.getNewValue();
                int result = -1;
                for (int k = 0; k < DeleteInsideBox3DDialog.this.options.length; k++) {
                    if (DeleteInsideBox3DDialog.this.options[k].equals(obj)) {
                        result = k;
                    }
                }

                if (result == 0) {
                    DeleteInsideBox3DDialog.this.optionPane = null;
                    DeleteInsideBox3DDialog.this.dialog.setVisible(false);
                    DeleteInsideBox3DDialog.this.dialog.dispose();
                    DeleteInsideBox3DDialog.this.dialog = null;
                    remWins();  
//                  Visu3DDeleteInsideBox visuOld = (Visu3DDeleteInsideBox) DeleteInsideBox3DDialog.this.simpleTree.getGui().getMonitor().getSelectedComponent();
//                  visuOld.setDialog(null);
//                  DeleteInsideBox3DDialog.this.visu = null;
//                  Monitor monitor = DeleteInsideBox3DDialog.this.simpleTree.getGui().getMonitor();
//                  monitor.removeAll();
//                  monitor.revalidate();
//                  new Thread() {
//                        @Override
//                        public void run() {
//                            try {
//                                Thread.sleep(100);
//                            } catch (InterruptedException e) {
//                                e.printStackTrace();
//                            }
//                            Runtime.getRuntime().gc();
//                        }
//                    }.start();
                    //Visu3dBasic visu = new Visu3dBasic(DeleteInsideBox3DDialog.this.simpleTree, monitor.getWidth(), monitor.getHeight());
                    //monitor.add(visu,DeleteInsideBox3DDialog.this.simpleTree.getModel().getTreeID());
                    //DeleteInsideBox3DDialog.this.optionPane.removeAll();
//                  DeleteInsideBox3DDialog.this.optionPane = null;
                    //DeleteInsideBox3DDialog.this.dialog.setVisible(false);
                    //DeleteInsideBox3DDialog.this.dialog.dispose();
//                  DeleteInsideBox3DDialog.this.dialog = null;
//                  DeleteInsideBox3DDialog.this.remWins();                 
                }

            }
        });
//      this.optionPane = null;
//      this.dialog.setVisible(false);
//      this.dialog.dispose();
//      this.dialog = null;
//      remWins();      

    }

    private void remWins() {
        runProcess = true;
        timer = new Timer(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (runProcess) {
                    for (Window win: Window.getWindows()) {
                        if (win instanceof JDialog) {
                            System.out.println("    Trying to Remove JDialog");
                            try {
                                win.getParent().remove(win);
                            } catch (Exception e1) {

                            }
                            ((JDialog) win).setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
                            ((Dialog) win).setModalityType(Dialog.ModalityType.MODELESS);

                            win.dispose();
                        }
                    }
                    System.out.println("    Remove Cycle Done :-)");
                    runProcess = false;
                    new Thread() {
                        @Override
                        public void run() {
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                            Runtime.getRuntime().gc();
                        }
                    }.start();
                } else {
                    if(maxLoop>=2){
                        timer.stop();
                    } else {
                        pastRemWins();
                        runProcess = true;
                    }

                }
            }
        });
        //timer.setRepeats(true);
        timer.start();
    }

    private void pastRemWins() {
        System.out.println("    Checking if still exists any of TopLayoutContainers");
        Window[] wins = Window.getWindows();
        for (int i = 0; i < wins.length; i++) {
            if (wins[i] instanceof JFrame) {
                System.out.println("JFrame");
            } else if (wins[i] instanceof JDialog) {
                System.out.println("JDialog");
            } else {
                System.out.println(wins[i].getClass().getSimpleName());
            }
        }
        // We must expect 2 windows here: this (RemoveDialogOnRuntime) and the parent of all parentless dialogs
        if (wins.length > 2) {
            wins = null;
            maxLoop++;
            if (maxLoop <= 3) {
                System.out.println("    Will Try Remove Dialog again, CycleNo. " + maxLoop);
                System.out.println(" -----------------------------------------------------------");
                remWins();
            } else {
                System.out.println(" -----------------------------------------------------------");
                System.out.println("*** End of Cycle Without Success, Exit App ***");
                //System.exit(0);
                timer.stop();
            }
        } else {
            timer.stop();
        }
    }


}

这不是在运行,实际运行的类(其中删除了JDialog )是同一个类,其中包含在监听器末尾的5个相关行,同时也删除了侦听器。

代码语言:javascript
复制
    public DeleteInsideBox3DDialog(SimpleTree simpleTree, Visu3DDeleteInsideBox visu) {
        this.simpleTree = simpleTree;
        this.visu = visu;
        this.lastDeleted = new ArrayList<Point3D>();
        this.options = new String[] { "Done" };
        Object complexMsg[] = { centerXPanel(),centerYPanel(),centerZPanel()
                ,dimXPanel(),dimYPanel(),dimZPanel()
                ,deleteButtonPanel(),undeleteButtonPanel() };
        this.optionPane = new JOptionPane();

        this.optionPane.setMessage(complexMsg);
        this.optionPane.setOptions(this.options);
        this.optionPane.setMessageType(JOptionPane.PLAIN_MESSAGE);
//          this.dialog = this.optionPane.createDialog(this.simpleTree.getGui()
//                  .getMonitor().getSelectedComponent(),
//                  "Delete Points contained in a box");
            this.dialog = this.optionPane.createDialog("Delete Points contained in a box");
            this.dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        this.dialog.setModalityType(Dialog.ModalityType.MODELESS);
//      this.dialog.setSize(800, 400);
        this.dialog.setVisible(true);
        this.dialog.setVisible(false);
        this.dialog.setVisible(true);
        this.dialog.pack();
//      this.optionPane.addPropertyChangeListener(new PropertyChangeListener() {
//          
//          @Override
//          public void propertyChange(PropertyChangeEvent evt) {
//              Object obj = evt.getNewValue();
//              int result = -1;
//              for (int k = 0; k < DeleteInsideBox3DDialog.this.options.length; k++) {
//                  if (DeleteInsideBox3DDialog.this.options[k].equals(obj)) {
//                      result = k;
//                  }
//              }
//
//              if (result == 0) {
////                    DeleteInsideBox3DDialog.this.optionPane = null;
////                    DeleteInsideBox3DDialog.this.dialog.setVisible(false);
////                    DeleteInsideBox3DDialog.this.dialog.dispose();
////                    DeleteInsideBox3DDialog.this.dialog = null;
////                    remWins();  
////                    Visu3DDeleteInsideBox visuOld = (Visu3DDeleteInsideBox) DeleteInsideBox3DDialog.this.simpleTree.getGui().getMonitor().getSelectedComponent();
////                    visuOld.setDialog(null);
////                    DeleteInsideBox3DDialog.this.visu = null;
////                    Monitor monitor = DeleteInsideBox3DDialog.this.simpleTree.getGui().getMonitor();
////                    monitor.removeAll();
////                    monitor.revalidate();
////                    new Thread() {
////                        @Override
////                        public void run() {
////                            try {
////                                Thread.sleep(100);
////                            } catch (InterruptedException e) {
////                                e.printStackTrace();
////                            }
////                            Runtime.getRuntime().gc();
////                        }
////                    }.start();
//                  //Visu3dBasic visu = new Visu3dBasic(DeleteInsideBox3DDialog.this.simpleTree, monitor.getWidth(), monitor.getHeight());
//                  //monitor.add(visu,DeleteInsideBox3DDialog.this.simpleTree.getModel().getTreeID());
//                  //DeleteInsideBox3DDialog.this.optionPane.removeAll();
////                    DeleteInsideBox3DDialog.this.optionPane = null;
//                  //DeleteInsideBox3DDialog.this.dialog.setVisible(false);
//                  //DeleteInsideBox3DDialog.this.dialog.dispose();
////                    DeleteInsideBox3DDialog.this.dialog = null;
////                    DeleteInsideBox3DDialog.this.remWins();                 
//              }
//              
//          }
//      });
        this.optionPane = null;
        this.dialog.setVisible(false);
        this.dialog.dispose();
        this.dialog = null;
        remWins();      

    }

这两个真正代码片段的唯一区别似乎是侦听器的使用,它将所有东西从工作更改到不工作,但是当我试图生成示例代码时,侦听器的代码也在工作。

编辑前:

我有一个应用程序处理地面激光扫描数据(在1兆到20兆3d点之间)。我现在清理我的代码并重新处理不同的类。现在我遇到内存使用问题,我不知道它们是从哪里来的。

基本信息:

操作系统: Win 7终极64位SP1

Ram :16 Ram

项目执行环境: JavaSE-1.7

由于这个项目非常复杂,我想很难提供一个运行中的例子。基本上,在我使用以下参数启动应用程序之后的步骤如下:

-XX:-UseGCOverheadLimit

-Xms14g

-Xmx14g

加载asci格式的点云,并将它们存储在一个point类(类名Point3D)中,实现Point3f (抱歉,混淆了名称),并将其可视化。执行以下操作之一,这些操作都是在我的Gui中调用一个JDialog:

  • 空间聚类
  • 删除删除框中的点

每当我重做其中一个操作时,任务管理器中显示的内存使用量就会扩大。让我们坚持删除点。我在gui中按下一个按钮,调用以下类:

EN

回答 1

Stack Overflow用户

发布于 2014-03-25 14:20:28

Java不使用显式内存管理。您对垃圾收集器的调用只是建议性的,JVM可能会忽略该调用。此外,空闲堆内存通常不会返回到操作系统(例如,它不像C++删除调用);相反,它假设内存将在中再次使用,并将对其进行管理。我不会给JVM提供14 it的堆(-Xms14g -Xmx14g),除非我希望JVM使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22637187

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档