7.1* Jak wybrać odpowiedni Garbage Collector
Jeśli Twoja aplikacja nie ma ścisłych wymagań dotyczących opóźnień, powinieneś po prostu uruchomić aplikację i pozwolić JVM samej wybrać odpowiedni moduł zbierający.
W większości przypadków ustawienia domyślne działają dobrze. W razie potrzeby można dostosować rozmiar sterty, aby poprawić wydajność. Jeśli wydajność nadal nie jest zgodna z oczekiwaniami, spróbuj zmodyfikować moduł zbierający, aby odpowiadał wymaganiom aplikacji.
- Sekwencyjny . Jeśli aplikacja ma mały zestaw danych (do około 100 MB) i/lub będzie działać na jednym procesorze bez żadnych wymagań dotyczących opóźnień.
- równoległy . Jeśli priorytetem jest maksymalna wydajność aplikacji i nie ma wymagań dotyczących opóźnień (lub dopuszczalne są przerwy trwające co najmniej jedną sekundę).
- CMS/G1 . Jeśli czas odpowiedzi jest ważniejszy niż ogólna przepływność, a przerwy w wyrzucaniu elementów bezużytecznych powinny być krótsze niż jedna sekunda.
- ZGC . Jeśli czas odpowiedzi ma wysoki priorytet i/lub w grę wchodzi bardzo duża sterta.
7.2* Zalecenia dotyczące wyrzucania elementów bezużytecznych
Unikaj ręcznych wyzwalaczy
Oprócz podstawowych mechanizmów wyrzucania elementów bezużytecznych, jednym z najważniejszych punktów dotyczących tego procesu w Javie jest to, że jest on niedeterministyczny. Oznacza to, że nie można przewidzieć, kiedy dokładnie w czasie wykonywania to nastąpi.
Używając metod System.gc() lub Runtime.gc() możesz zawrzeć w swoim kodzie wskazówkę, aby uruchomić moduł wyrzucania elementów bezużytecznych, ale nie gwarantuje to, że będzie on faktycznie działał.
Korzystaj z narzędzi analitycznych
Jeśli nie masz wystarczającej ilości pamięci do uruchomienia aplikacji, wystąpią spowolnienia, długie czasy wyrzucania elementów bezużytecznych, zdarzenia „zatrzymania świata” i ostatecznie błędy braku pamięci. Może to oznaczać, że sterta jest za mała, ale może też oznaczać, że w aplikacji występuje wyciek pamięci.
Możesz użyć narzędzia do monitorowania, takiego jak jstat lub Java Flight Recorder, aby sprawdzić, czy użycie sterty rośnie w nieskończoność, co może wskazywać na błąd w kodzie.
Preferuj ustawienia domyślne
Jeśli masz małą, samodzielną aplikację Java, prawdopodobnie nie będziesz musiał konfigurować wyrzucania elementów bezużytecznych. Domyślne ustawienia będą ci dobrze służyć.
Użyj flag JVM, aby dostosować
Najlepszym podejściem do konfigurowania wyrzucania elementów bezużytecznych w Javie jest ustawienie flag JVM. Flagi mogą służyć do ustawiania modułu wyrzucania elementów bezużytecznych (na przykład Serial, G1 itd.), początkowego i maksymalnego rozmiaru sterty, rozmiaru partycji sterty (na przykład Młoda generacja, Stara generacja) i wielu więcej.
Wybierz odpowiedni kran
Dobrą wskazówką w zakresie ustawień początkowych jest charakter aplikacji niestandardowej. Na przykład współbieżny moduł wyrzucania elementów bezużytecznych jest wydajny, ale często wywołuje zdarzenia „zatrzymania świata”, co czyni go bardziej odpowiednim do przetwarzania wewnętrznego, w którym dopuszczalne są długie przerwy.
Jednocześnie Garbage Collector CMS został zaprojektowany tak, aby zminimalizować opóźnienia, co czyni go idealnym rozwiązaniem dla aplikacji internetowych, w których ważna jest responsywność.