JFrame对象的垃圾收集器

时间:2012-03-23 11:49:32

标签: java swing garbage-collection jframe

import javax.swing.*;

public class Main
{
    public Main()
    {
        JFrame jf = new JFrame("Demo");
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(100, 100);
        jf.setVisible(true);
    }
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new Main();
            }
        });
        Runtime.getRuntime().gc();

    }

}

我调用Runtime.getRuntime().gc();进行显式垃圾收集器调用。但是窗口不会从屏幕上消失,为什么垃圾收集器不会回收JFrame对象?

3 个答案:

答案 0 :(得分:8)

当创建JFrame时,它会在一些内部Swing数据结构中注册自己,这允许它接收鼠标点击等事件。这意味着在你告诉Swing使用dispose()摆脱窗口之前,有一个潜藏在某处的对象的引用。

答案 1 :(得分:5)

给定invokeLater()调用,对GC的调用可能会发生在第1个 1

BTW - 调用Runtime.gc()通常是没有意义的,JRE不会直到它需要GC。

  1. E.G。
  2. 输出

    GC called
    Frame visible
    

    代码

    package test;
    
    import javax.swing.JFrame;
    import javax.swing.SwingUtilities;
    
    public class VisibleFrameGC {
    
        VisibleFrameGC() {
            JFrame jf = new JFrame("Demo");
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.setSize(100, 100);
            jf.setVisible(true);
            System.out.println("Frame visible");
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new VisibleFrameGC();
                }
            });
            Runtime.getRuntime().gc();
            System.out.println("GC called");
        }
    }
    

答案 2 :(得分:4)

框架是可见的,并且至少有一个GUI线程(事件调度线程)可以访问对象的引用。这就是为什么它不是垃圾收集。


如果您希望它消失,请使用frame.dispose()