1 import java.awt.*;
   2 import java.awt.event.WindowAdapter;
   3 import java.awt.event.WindowEvent;
   4 import java.lang.ref.WeakReference;
   5 
   6 /**
   7  * @test
   8  * @summary AwtList not garbage collected
   9  * @run main AwtListGarbageCollectedTest
  10  */
  11 
  12 public class AwtListGarbageCollectedTest {
  13     public static void main(String[] args) {
  14         Frame frame = new Frame("List leak test");
  15         try {
  16             test(frame);
  17         } catch (RuntimeException e) {
  18             frame.dispose();
  19             throw e;
  20         }
  21     }
  22 
  23     private static void test(Frame frame) {
  24         WeakReference<List> weakRef = null;
  25         try {
  26             frame.addWindowListener(new WindowAdapter() {
  27                 @Override
  28                 public void windowClosing(WindowEvent e) {
  29                     System.exit(0);
  30                 }
  31             });
  32             frame.setSize(300, 200);
  33             Panel panel = new Panel();
  34             frame.add(panel);
  35             frame.setVisible(true);
  36 
  37             {
  38                 List list = new List();
  39                 frame.add(list);
  40                 list.setMultipleMode(true);
  41                 frame.remove(list);
  42                 weakRef = new WeakReference<List>(list);
  43             }
  44 
  45             //make OutOfMemoryError to force gc
  46             String veryLongString = new String(new char[100]);
  47             while (true) {
  48                 veryLongString += veryLongString;
  49             }
  50         } catch (OutOfMemoryError e) {
  51             if (weakRef == null)
  52                 throw new RuntimeException("Weak ref wasn't created");
  53             if (weakRef.get() != null)
  54                 throw new RuntimeException("List wasn't garbage collected");
  55         }
  56     }
  57 }