为什么JFrame实例总是在Swing应用程序中可以访问?这不会阻止它被垃圾收集吗?
JFrame frame = new JFrame();
System.out.println(Window.getWindows().length); // says '1'
致电dispose()
没有帮助。它甚至没有显示出来。
答案 0 :(得分:5)
java.awt.Windows上没有getWindows方法,但是有一个Frame.getFrames()方法。
但我知道他们都使用WeakReference来管理这些事情。
基本上,我们的想法是Window和Frame类都有一个名为 weakThis 的字段,它是当前帧/窗口对象的弱引用。每当需要存储对象时(例如在appcontext中),使用weakThis字段代替它。 (如果你不知道的话,弱引用不会阻止对象的获取)
编辑:Window.getWindows在1.6中添加。
答案 1 :(得分:-2)
这是因为你仍然有一个对你的窗口的引用,你没有让JFrame为垃圾收集做好准备,这样就完成了删除对它的引用。例如,将其设置为null;
如果垃圾收集器进行了清理,则下一个示例将返回0。
JFrame frame = new JFrame();
frame = null;
System.gc();
System.out.println(Window.getWindows().length);
这是示例代码,它将在大多数情况下工作,如果调用GC。无法保证System.gc()将调用GC。不要在生产代码中使用它。
答案 2 :(得分:-2)
因为JFrame对象尚未被垃圾回收。试试这个:
import java.io.*;
import java.awt.*;
import javax.swing.*;
public class WTest
{
public static void main(String[] args)
{
JFrame jfTmp = new JFrame();
jfTmp.dispose();
jfTmp = null;
System.runFinalization();
System.gc();
Window[] arrW = Window.getWindows();
for(int i = 0; i < arrW.length; i ++)
System.out.println("[" + i + "]\t" + arrW[i].getClass());
}
}