TłoJak rozwiązać problemy z wyciekiem pamięci ze słuchacza?
Więc czytałem, że często wycieki pamięci w aplikacji Swing pochodzą z wykorzystaniem różnych słuchaczy (mysz, klucz, ostrość, etc). Zasadniczo, ponieważ rejestrujesz obiekt jako słuchacz i zapominasz wyrejestrować obiekt, powiadamiający kończy trzymanie się odniesienia obiektu i przecieka trochę pamięci.
Wiedziałem nasza aplikacja nie została wyrejestrowania słuchaczy i zrobiłem trochę badań na temat potencjalnych rozwiązań:
znalazłem jedno podejście w radzeniu sobie z problemem było stosowanie WeakReference, pełne informacje na temat podejścia z huśtawką słuchacze można znaleźć here.
I wtedy stał się ciekaw jak redaktor NetBeans forma została generowania kodu posprzątać po słuchacze dodany do formularza i odkrył, że NetBeans został rejestracji słuchaczy za pośrednictwem obiektu owijania tj
argTypeComboBox.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent evt) {
argTypeComboBoxItemStateChanged(evt);
}
});
Ale wygenerowany kod nie nie wydaje się, aby kiedykolwiek oczyścić, dzwoniąc pod numer removeItemListener
.
Pytania
Czy przedmiot owijania działa jak słaby odniesienia? Dla mnie wygląda na to, że może przeciekać niewielką ilość pamięci (rozmiar obiektu owijającego)?
Czy masz inne podejście do słuchania, aby upewnić się, że zawsze są one gromadzone podczas usuwania śmieci?
Świetne wyjaśnienie Yishai, jakie podejście podjąłeś w kontaktach ze słuchaczami w fantazyjnej aplikacji, która miała duży wyciek pamięci? – Clinton
@ Clinton, kiedy zdiagnozowałem problem (który trochę potrwał, dużo profilowania), byłam pewna, że wyrejestrowałem słuchacza z okna. Nie pamiętam wszystkich szczegółów, ale to był klucz - nie wiedziałem wtedy o słabych referencjach jako standardowym rozwiązaniu problemu, mogłem być w stanie to wykorzystać. – Yishai
@ Yishai Robiłem wyrejestrowanie, kiedy słuchacz opuszczał lunetę ... Ale wydawało się, że jest trochę niezgrabny i szuka lepszego rozwiązania. Jeszcze raz dziękuję za korektę. – Clinton