Kiedy używać System.gc() ?

Kiedy używać System.gc() ?
LO
  • Rejestracja:prawie 20 lat
  • Ostatnio:ponad 4 lata
0

Hej! Mam pytanie do doświadczonych programistów Javy....
Kiedy używać funkcji gc()?
Tzn. System.gc() ?
Czy przed np. wykonaniem bardziej czasochłonnego i pamięciożernego zadania ? Czy to poprawi wydajność, zwiększy dostępną pamięć?
Z góry dzięki za opinie i przepraszam, jeśli pytanie jest głupie... Po prostu ciekawi mnie jak to jest w większych projektach/złożonych algorytmach itp....

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:około godziny
1

System.gc() nie daje żadnych gwarancji, że odśmiecanie się wykona. Wydajności to nie powinno poprawić, natomiast jeśli JVM uzna, że odśmieci na żądanie to możesz oczekiwać, że przez chwilę nie będzie lagów spowodowanych odśmiecaniem, oczywiście zależy to od tego jak często alokujesz obiekty.


"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
lipkerson
Ja kiedyś gdzieś przeczytałem że wywołanie raz gc to sugestia ale jeżeli w programie wywoła się dwa razy gc z rzędu to już jest rozkaz - prawda to? Kiedyś to podpatrywałem na profilerze ale mnie każde wywołanie gc czyściło - pewnie aplikacja testowa była za mała.
Wibowit
Przede wszystkim w samej dokumentacji jest napisane, że wywołanie System.gc() nic nie gwarantuje. Jest dziesiątki wersji Sunowskiej Javy, mało tego, są dziesiątki różnych JVMów, jest Dalvik (Android), itp itd Skoro nie ma na to gwarancji, to trzeba to traktować jako bonus, a nie coś na czym można polegać.
Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
0

Generalnie. Nigdy. :)

W programach, które mają ambicję należałoby teoretycznie użyć tego tuż po masowych zwolnieniach pamięci. Na przykład po zrobieniu masowych obliczeń i po zwolnieniu pamięci na ich wyniki pośrednie. Wtedy gc najszybciej i najłatwiej zdefragmentuje pamięć (połączy małe bloki w duże).


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
edytowany 1x, ostatnio: Olamagato
Koziołek
W JSE7 to już nie jest aktualne, bo zmieniono zarządzanie pamięcią i jeżeli tworzysz dużo obiektów o ograniczonym zakresie to GC potrafi zwolnić cały blok pamięci bez zbędnych ceregieli.
Olamagato
Tego nie wiedziałem. Jakiś link? To czy gdzieś jest opisane kiedy w obecnej wersji sugestie dla gc mają sens? :)
Olamagato
OK, ale G1 trzeba sobie specjalnie włączyć. Czyli zalecenia dla starego GC są w JSE7 wciąż aktualne.
Koziołek
teoretycznie tak :) jednak opłaca się G1 włączyć.
Koziołek
Moderator
  • Rejestracja:prawie 18 lat
  • Ostatnio:16 dni
  • Lokalizacja:Stacktrace
  • Postów:6821
0

Generalnie wywołanie System.gc() jest traktowane jako sugestia, a nie rozkaz i nie ma większego sensu ręczne wołanie tej metody. Jeżeli chcesz poprawić wydajność w części związanej z odśmiecaniem to raczej zainteresuj się tym jak można skonfigurować GC.


Sięgam tam, gdzie wzrok nie sięga… a tam NullPointerException

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.