JFrame实例如何在Swing应用程序中始终可达?这不会阻止它被垃圾收集?为什么Swing JFrame总是可以访问?
JFrame frame = new JFrame();
System.out.println(Window.getWindows().length); // says '1'
打电话dispose()
没有帮助。它甚至没有显示。
JFrame实例如何在Swing应用程序中始终可达?这不会阻止它被垃圾收集?为什么Swing JFrame总是可以访问?
JFrame frame = new JFrame();
System.out.println(Window.getWindows().length); // says '1'
打电话dispose()
没有帮助。它甚至没有显示。
java.awt.Windows上没有getWindows方法,但有一个Frame.getFrames()方法。
但我知道他们俩都用WeakReference来管理这样的事情。
基本上的想法是,这两个窗口和框架类有一个叫做weakThis字段这是一个的WeakReference于当前帧/窗口对象。无论何时需要存储对象(例如,在appcontext中),都会使用weakThis字段而不是此字段。 (如果你不知道的话,弱引用不会阻止对象的进入)
编辑:在1.6中添加Window.getWindows。
这是因为你仍然有一个对你的窗口的引用,你没有使JFrame准备好垃圾收集,这是完成删除对它的引用。例如,通过将其设置为null;
如果垃圾收集器进行了一轮清理,下一个示例将返回0。
JFrame frame = new JFrame();
frame = null;
System.gc();
System.out.println(Window.getWindows().length);
这是示例代码,将工作的大部分时间,如果被调用GC 。不能保证System.gc()会调用GC。不要在生产代码中使用它。
因为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());
}
}
不好。您不能强制JVM运行垃圾回收。 – Bombe 2011-03-25 10:22:45