我在一个Java应用程序上工作,该应用程序包含一个常规Window(JFrame)和一个由menuitem在第一个调用的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时,程序会消耗越来越多的内存。为什么呢?
答案 0 :(得分:2)
Instanciate MyDialog一次:
public class MainWindow {
private JFrame frame;
private final MyDialog dialog = new MyDialog();
在MyDialog构造函数中删除setVisible(true)
。
要显示对话框,请执行setVisible( true )
答案 1 :(得分:2)
原因是Top-Level Containers never will be GC'ed,Top-Level Containers are based on peer from Native OS
只创建一次JDialog,按getContentPane.removeAll