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的对象?

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

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

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

  1. 例如

产量

 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"); } } 

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


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