Фон
Итак, я прочитал, что часто утечки памяти в приложениях Swing происходят из-за использования различных слушателей (мышь, клавиша, фокус и т. д.). По сути, поскольку вы регистрируете объект в качестве прослушивателя и забываете отменить регистрацию объекта, уведомитель в конечном итоге удерживает ссылку на объект и немного теряет память.
Я знал, что наше приложение не отменяет регистрацию слушателей, и провел небольшое исследование потенциальных решений:
Я обнаружил, что одним из подходов к решению проблемы было использование WeakReference, полную информацию о подходе со свинг-слушателями можно найти здесь.
Затем мне стало любопытно, как редактор форм NetBeans генерирует код для очистки после того, как слушатели добавляли в форму, и обнаружил, что NetBeans регистрировал слушателей через объект-оболочку, т.е.
argTypeComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
argTypeComboBoxItemStateChanged(evt);
}
});
Но сгенерированный код, похоже, никогда не очищался вызовом removeItemListener
.
Вопросы
Объект-обертка действует как слабая ссылка? Мне кажется, что это может привести к утечке небольшого объема памяти (размер объекта-обертки)?
Есть ли у вас альтернативные подходы к слушателям, чтобы гарантировать, что они всегда удаляются сборщиком мусора, когда вы закончите с ними работать?