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对象?
答案 0 :(得分:8)
当创建JFrame
时,它会在一些内部Swing数据结构中注册自己,这允许它接收鼠标点击等事件。这意味着在你告诉Swing使用dispose()
摆脱窗口之前,有一个潜藏在某处的对象的引用。
答案 1 :(得分:5)
给定invokeLater()
调用,对GC的调用可能会发生在第1个 1 。
Runtime.gc()
通常是没有意义的,JRE不会直到它需要GC。
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)