-
Bug
-
Resolution: Duplicate
-
P4
-
None
-
6
-
x86
-
windows_xp
FULL PRODUCT VERSION :
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Windows XP Pro version 2002 SP2
A DESCRIPTION OF THE PROBLEM :
I create multiples modals dialogs form a modal dialog. When i close them, they are still reference by the Dialog#modalDialogs field. So they are never garbage collected(and the memory grows).
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Step
1. Launch the class TestDialog
2. Click 4 Times on 'Launch Dlg' button.This will open 4 Dialogs
3. Close these 4 dialogs
4. Click on 'GC' button
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Remove All On Dlg Test 3
Remove All On Dlg Test 2
Remove All On Dlg Test 1
Remove All On Dlg Test 0
mem = 576K / 16320K
ACTUAL -
Remove All On Dlg Test 3
Remove All On Dlg Test 2
Remove All On Dlg Test 1
Remove All On Dlg Test 0
mem = 576K / 16320K
Dlg Test 2
Dlg Test 0
Dlg Test 1
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.Box;
import java.awt.HeadlessException;
import java.awt.Window;
import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
public class TestDialog extends JFrame {
public static int count = 0;
public static int dlgcount = 0;
private WeakHashMap<JDialog,Integer> m_hash = new WeakHashMap<JDialog, Integer>();
public TestDialog() throws HeadlessException {
super("Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Box b = Box.createHorizontalBox();
b.add(new JButton(new AShowDlg<JFrame>(this)));
b.add(new JButton(new AGC()));
getContentPane().add(b);
pack();
setVisible(true);
}
private class AGC extends AbstractAction {
public AGC() {
super("GC");
}
public void actionPerformed(ActionEvent e) {
System.gc();
System.gc();
System.gc();
System.gc();
long totMem = Runtime.getRuntime().totalMemory();
long freeMem = Runtime.getRuntime().freeMemory();
String mem = "" + (totMem - freeMem) / 1024 + "K / " + totMem / 1024 + "K";
System.out.println("mem = " + mem);
for (JDialog dlg : m_hash.keySet())
System.out.println(""+dlg.getTitle());
}
}
private class AShowDlg<T extends Window> extends AbstractAction {
private WeakReference<T> m_dlg;
public AShowDlg(T dlg) {
super("Launch Dlg");
m_dlg = new WeakReference<T>(dlg);
}
public void actionPerformed(ActionEvent e) {
dlgcount++;
JDialog dlg = new JDialog(m_dlg.get(), "Dlg Test " + (count++), Dialog.ModalityType.APPLICATION_MODAL);
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dlg.setLocation(0,50*dlgcount);
Box b = Box.createHorizontalBox();
b.add(new JButton(new AShowDlg<JDialog>(dlg)));
b.add(new JButton(new AGC()));
dlg.getContentPane().add(b);
dlg.pack();
m_hash.put(dlg,count-1);
dlg.setVisible(true);
dlg.dispose();
System.out.println("Remove All On "+dlg.getTitle());
dlg.removeAll();
dlgcount--;
}
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
new TestDialog();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
---------- END SOURCE ----------
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Client VM (build 1.6.0_01-b06, mixed mode, sharing)
ADDITIONAL OS VERSION INFORMATION :
Windows XP Pro version 2002 SP2
A DESCRIPTION OF THE PROBLEM :
I create multiples modals dialogs form a modal dialog. When i close them, they are still reference by the Dialog#modalDialogs field. So they are never garbage collected(and the memory grows).
STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
Step
1. Launch the class TestDialog
2. Click 4 Times on 'Launch Dlg' button.This will open 4 Dialogs
3. Close these 4 dialogs
4. Click on 'GC' button
EXPECTED VERSUS ACTUAL BEHAVIOR :
EXPECTED -
Remove All On Dlg Test 3
Remove All On Dlg Test 2
Remove All On Dlg Test 1
Remove All On Dlg Test 0
mem = 576K / 16320K
ACTUAL -
Remove All On Dlg Test 3
Remove All On Dlg Test 2
Remove All On Dlg Test 1
Remove All On Dlg Test 0
mem = 576K / 16320K
Dlg Test 2
Dlg Test 0
Dlg Test 1
REPRODUCIBILITY :
This bug can be reproduced always.
---------- BEGIN SOURCE ----------
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.Box;
import java.awt.HeadlessException;
import java.awt.Window;
import java.awt.Dialog;
import java.awt.event.ActionEvent;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
public class TestDialog extends JFrame {
public static int count = 0;
public static int dlgcount = 0;
private WeakHashMap<JDialog,Integer> m_hash = new WeakHashMap<JDialog, Integer>();
public TestDialog() throws HeadlessException {
super("Test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Box b = Box.createHorizontalBox();
b.add(new JButton(new AShowDlg<JFrame>(this)));
b.add(new JButton(new AGC()));
getContentPane().add(b);
pack();
setVisible(true);
}
private class AGC extends AbstractAction {
public AGC() {
super("GC");
}
public void actionPerformed(ActionEvent e) {
System.gc();
System.gc();
System.gc();
System.gc();
long totMem = Runtime.getRuntime().totalMemory();
long freeMem = Runtime.getRuntime().freeMemory();
String mem = "" + (totMem - freeMem) / 1024 + "K / " + totMem / 1024 + "K";
System.out.println("mem = " + mem);
for (JDialog dlg : m_hash.keySet())
System.out.println(""+dlg.getTitle());
}
}
private class AShowDlg<T extends Window> extends AbstractAction {
private WeakReference<T> m_dlg;
public AShowDlg(T dlg) {
super("Launch Dlg");
m_dlg = new WeakReference<T>(dlg);
}
public void actionPerformed(ActionEvent e) {
dlgcount++;
JDialog dlg = new JDialog(m_dlg.get(), "Dlg Test " + (count++), Dialog.ModalityType.APPLICATION_MODAL);
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dlg.setLocation(0,50*dlgcount);
Box b = Box.createHorizontalBox();
b.add(new JButton(new AShowDlg<JDialog>(dlg)));
b.add(new JButton(new AGC()));
dlg.getContentPane().add(b);
dlg.pack();
m_hash.put(dlg,count-1);
dlg.setVisible(true);
dlg.dispose();
System.out.println("Remove All On "+dlg.getTitle());
dlg.removeAll();
dlgcount--;
}
}
private static void createAndShowGUI() {
JFrame.setDefaultLookAndFeelDecorated(true);
new TestDialog();
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
---------- END SOURCE ----------
- duplicates
-
JDK-6497929 Modal dialogs are added to modalDialogs field several times
-
- Closed
-