Kiedy zbierać śmieci
Mam fragment kodu, który ładuje bardzo duży obraz do pamięci. Więc wydawało mi się rozsądne zadzwonić
System.gc();
przed załadowaniem obrazu. Z tego, co mogę powiedzieć, działa bez problemów.
Wczoraj postanowiłem użyć całkiem przydatnego oprogramowania o nazwieFindBugs skanuje twój kod i zgłasza problemy, które mogą powodować błędy lub ogólnie nie zalecane strategie. Problem polega na tym, że ten fragment kodu, o którym wspomniałem, zostanie zgłoszony. Opis jest następujący:
... wymusza zbieranie śmieci; niezwykle wątpliwy, z wyjątkiem kodu benchmarkingu
I to się rozwija:
Kod jawnie wywołuje zbieranie śmieci. Z wyjątkiem specyficznego zastosowania w benchmarkingu, jest to bardzo wątpliwe.
W przeszłości sytuacje, w których ludzie jawnie wywoływali garbage collector w procedurach takich jak zamykanie lub finalizowanie metod, doprowadziły do ogromnych czarnych dziur wydajności. Zbieranie śmieci może być kosztowne. Każda sytuacja wymuszająca setki lub tysiące zbiórek śmieci spowoduje, że maszyna zacznie się czołgać.
Więc moje pytanie brzmi:Czy w takim przypadku NIE jest OK programowe wywołanie garbage collectora? Mój kod wywołuje go tylko raz, a metoda, w której się znajduje, jest rzadko używana. A jeśli wywołanie go nie jest w porządku, co powinieneś zrobić w przypadku, gdy potrzebujesz tak dużo pamięci, jak to możliwe, zanim wykonasz bardzo intensywną operację pamięci i musisz zwolnić tyle pamięci, ile to możliwe przedtem?