我有一个JFrame,我从它打开一个JDialog,从那个对话框打开另一个JDialog - menas我有3个窗口可见(JFrame,JDialog1,Jdialog2)。
当我关闭两个对话框并运行几次垃圾收集器时(来自netbeans profiler) 我可以看到JDialog2(从JDialog1打开的那个)是垃圾收集但是JDialog1(从JFrame打开)仍然挂在活动对象池中。
我每次都会创建新对象 - 所以经过一段时间后,我有一个OutOfMemoryError doue来记忆泄漏。
我是否必须以特殊方式处理JDialogs,以免泄漏?
顺便说一下 我做setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE)
在两个对话框上,
答案 0 :(得分:9)
您是否在对话框中取消注册了所有听众(包括其中的任何组件)?
让听众注册可能是内存泄漏的主要来源。
答案 1 :(得分:4)
您的默认关闭操作是什么?来自java JDialog api:
默认情况下,该值设置为
HIDE_ON_CLOSE
。
这意味着基本上当用户点击关闭时调用setVisible(false)
或几乎等效的jDialog1.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE)
。你观察到的行为与此一致。
尝试
{{1}}
答案 2 :(得分:1)
要释放已分配的资源,您必须调用dispose方法。仅仅隐藏对话框是不够的。