2013-07-31 21 views
2

上下文:我有一个从父“启动器”程序运行的Swing JFrame应用程序。启动程序负责检查更新并实际更新应用程序。因此它在儿童类加载器中运行该应用程序,最终在新的jar可用时重新启动它。setSize/Bounds和AWT/Swing清理上的Swing内存泄漏

现在,一切工作正常,但我有这个问题:它看起来像从JFrame的东西泄漏,并防止垃圾收集JFrame和整个类加载器。通过Frame.getFrames()显示,即使它被丢弃,JFrame仍然以某种方式仍然存在。

我已经能够将测试用例减少到以下类。请注意,调用setBounds对于发生错误是必要的,如果您删除它,则JFrame将被垃圾回收并从getFrames()中消失。我无法理解该方法触发了什么问题,因为它可以处理数以百万计的内容。

我在JDK 1.7.0_25-B17运行

import java.awt.Frame; 
import java.io.IOException; 

import javax.swing.JFrame; 

public class BugTest extends JFrame { 
    public BugTest() { 
     setDefaultCloseOperation(DISPOSE_ON_CLOSE); 
     setBounds(0, 0, 100, 100); // <- comment this and the leak disappear! -<< 
     setVisible(true); 
    } 

    public static void main(String[] args) throws IOException { 
     new BugTest(); 

     System.out.println("Close the window then press enter"); 
     System.in.read(); 
     System.gc(); 

     Frame[] frames = Frame.getFrames(); 
     System.out.println("There are " + frames.length + " frames (should be 0)"); 
     for (Frame frame : frames) { 
      System.out.println(frame); 
     } 
    } 

    public void finalize() { 
     System.out.println("Frame was finalized"); 
    } 
} 

顺便说一句,它看起来像线程AWT窗口是不可能杀人。一旦开始,即使没有更多的窗口或任何东西,它也不会终止。是否可以妥善清理?

Boes任何人都可以洞察发生了什么?我应该做些别的事情来清理一切吗?

回答