Утечка памяти при закрытии JDialog

Я работаю над приложением Java, состоящим (пока) из обычного окна (JFrame) и JDialog, вызываемого пунктом меню в первом:

public class MainWindow {
    private JFrame frame;
    public MyDialog dialog;
    /* ... */
    private void initialize() {
         mnNew = new JMenuItem("New...");
         mnNew.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent arg0) {
             dialog = new MyDialog();
             }
         });
     }
}

И MyDialog определяется следующим образом:

public class MyDialog extends JDialog {

    public MyDialog() {
        /* ... */
        JButton cancelButton = new JButton("Cancel");
        cancelButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                MyDialog.this.dispatchEvent(new WindowEvent(MyDialog.this,
                                            WindowEvent.WINDOW_CLOSING));
                MainWindow.window.matchMaker = null;
            }
        });
        /* ... */
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setVisible(true);
    }
}

Все работает нормально, но мой диспетчер задач сообщает, что каждый раз, когда я открываю и затем закрываю MyDialog, программа потребляет все больше и больше памяти. Почему?


person Sventimir    schedule 07.04.2013    source источник


Ответы (2)


person mKorbel    schedule 07.04.2013
comment
Большое спасибо. Но разве MyDialog не следует удалять из памяти после удаления и установки переменной dialog в null? Во всяком случае, это ничего не делает. Теперь я создаю MyDialog один раз в конструкторе MainWindow, устанавливая его видимость на false. Я делаю его видимым с помощью функции в MainWindow и невидимым с помощью другой — в MyDialog, но память все еще теряется всякий раз, когда я закрываю и снова открываю диалоговое окно. - person Sventimir; 07.04.2013
comment
это возможно только при использовании статических переменных, - person mKorbel; 07.04.2013

Создайте экземпляр MyDialog один раз:

public class MainWindow {
   private JFrame frame;
   private final MyDialog dialog = new MyDialog();

удаляет setVisible(true) в конструкторе MyDialog.

Чтобы отобразить диалоговое окно, просто выполните setVisible( true )

person Aubin    schedule 07.04.2013