上下文:我有一个从父“启动器”程序运行的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任何人都可以洞察发生了什么?我应该做些别的事情来清理一切吗?