2011-03-25 79 views
5

JFrame实例如何在Swing应用程序中始终可达?这不会阻止它被垃圾收集?为什么Swing JFrame总是可以访问?

 
JFrame frame = new JFrame(); 
System.out.println(Window.getWindows().length); // says '1' 

打电话dispose()没有帮助。它甚至没有显示。

回答

5

java.awt.Windows上没有getWindows方法,但有一个Frame.getFrames()方法。

但我知道他们俩都用WeakReference来管理这样的事情。

基本上的想法是,这两个窗口和框架类有一个叫做weakThis字段这是一个的WeakReference于当前帧/窗口对象。无论何时需要存储对象(例如,在appcontext中),都会使用weakThis字段而不是此字段。 (如果你不知道的话,弱引用不会阻止对象的进入)

编辑:在1.6中添加Window.getWindows。

-2

这是因为你仍然有一个对你的窗口的引用,你没有使JFrame准备好垃圾收集,这是完成删除对它的引用。例如,通过将其设置为null;

如果垃圾收集器进行了一轮清理,下一个示例将返回0。

JFrame frame = new JFrame(); 
frame = null; 
System.gc(); 
System.out.println(Window.getWindows().length); 

这是示例代码,将工作的大部分时间,如果被调用GC 。不能保证System.gc()会调用GC。不要在生产代码中使用它。

-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()); 
    } 
} 
+1

不好。您不能强制JVM运行垃圾回收。 – Bombe 2011-03-25 10:22:45