【发布时间】:2010-12-25 02:07:36
【问题描述】:
背景
所以我读到 Swing 应用程序中的内存泄漏通常源于使用各种侦听器(鼠标、键、焦点等)。本质上,因为您将一个对象注册为侦听器而忘记取消注册该对象,所以通知程序最终会保留该对象的引用,并泄漏一些内存。
我知道我们的应用程序没有取消注册侦听器,因此对潜在的解决方案进行了一些研究:
我发现处理该问题的一种方法是使用 WeakReference,有关摇摆侦听器方法的完整详细信息可以在 here 找到。
然后我开始好奇NetBeans 表单编辑器是如何在将侦听器添加到表单后生成代码进行清理的,并发现 NetBeans 正在通过包装对象注册侦听器,即
argTypeComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
argTypeComboBoxItemStateChanged(evt);
}
});
但生成的代码似乎并没有通过调用 removeItemListener 来清理。
问题
包装对象是否像弱引用一样?在我看来,它可能会泄漏少量内存(包装对象的大小)?
在与侦听器打交道时,您是否有其他方法可以确保在您处理完它们后始终对它们进行垃圾回收?
【问题讨论】:
标签: java swing memory-leaks listeners