是什么触发了JFrames和其他Swing组件的垃圾收集?在下面的代码中,在第二个Thread.sleep()
期间分析堆表明JFrame实例没有被垃圾收集(我特别使用VisualVM)。即使在VisualVM中手动运行垃圾收集后,实例仍然存在。 Swing线程是否以某种方式持有对这些的引用?有趣的是,如果删除了第一个Thread.sleep(2000)
,则会收集JFrame。
import javax.swing.JFrame;
public class TestDemo {
public static void makeFrame() {
JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setVisible(true);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
frame.dispose();
frame = null;
}
public static void main(String[] args) {
makeFrame();
System.gc();
try {
Thread.sleep(1000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
为什么会出现这种情况?