为什么这些JFrame没有被垃圾收集?

时间:2016-03-15 22:53:00

标签: java swing memory garbage-collection jframe

是什么触发了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();
        }
    }
}

为什么会出现这种情况?

0 个答案:

没有答案