为什么GC不清除Dialog引用?

时间:2010-04-01 07:29:05

标签: java user-interface swing garbage-collection

我有一个对话框。每当我创建它然后处理它,它就会留在内存中。

这似乎是某个地方的内存泄漏,但我无法弄明白。 你有什么想法?有关详细信息,请参阅堆转储的屏幕截图。

提前致谢。

http://img441.imageshack.us/img441/5764/leak.png

6 个答案:

答案 0 :(得分:2)

如果我正确理解了你的截图,那么所有的指示都很弱,所以最终它会得到GCd。但何时将无法保证GCd;通常它不会立即发生。您可以尝试通过运行垃圾收集器(System.gc())来快速启动GC,但仍无法保证它是否会收集所有垃圾。

答案 1 :(得分:0)

您确定要丢弃对话框吗? JDialog的标准是HIDE_ON_CLOSE。如果您尚未将defaultCloseOperation更改为DISPOSE_ON_CLOSE,则可能会有所帮助。

答案 2 :(得分:0)

只要你持有对这个窗口的引用,它就不会被垃圾收集删除。您确定不仅处理它(只释放与窗口相关的资源,而不是窗口本身),还清除所有引用?

答案 3 :(得分:0)

根据您的对象是哪一代堆,它将会或不会被次要GC垃圾收集。为了确保所有非强引用对象都是GCed,你必须运行一个完整的GC,实现这一点的方法是激发OutOfMemoryError ......你可以使用以下代码来实现:

try {
        List<byte[]> list = new ArrayList<byte[]>();
        while (true) {
            list.add(new byte[1024]);
        }
    } catch (OutOfMemoryError oome) {
        // full GC should have run here...
    }

答案 4 :(得分:0)

你确定GC实际上已经运行了吗?使用java -verbose:gc etc启动您的应用,每次执行GC时,VM都会将状态报告转储到控制台。有关garbage collection tuning for Java 6的更多详情。

答案 5 :(得分:0)

其他人对System.gc()提出建议是对的。或者,您可以使用实现JVM工具接口方法ForceGarbageCollection的工具检查程序的堆,例如NetBeans概要分析器。