我有一个对话框。每当我创建它然后处理它,它就会留在内存中。
这似乎是某个地方的内存泄漏,但我无法弄明白。 你有什么想法?有关详细信息,请参阅堆转储的屏幕截图。
提前致谢。
答案 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概要分析器。