JFrame对象的垃圾收集器

eXX*_*XX2 1 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();

    }

}
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*ski 8

JFrame被创建时,它注册本身在一些内部摇摆的数据结构,其允许它接收到类似的鼠标点击的事件.这意味着你的对象潜伏在某个地方,直到你告诉Swing摆脱使用窗口dispose().


And*_*son 5

在给出invokeLater()调用的情况下,对GC的调用可能会发生在第1个1.

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

  1. 例如

产量

GC called
Frame visible
Run Code Online (Sandbox Code Playgroud)

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");
    }
}
Run Code Online (Sandbox Code Playgroud)