/ / Dlaczego FullGC nie może zwolnić pamięci fizycznej (RES)? - Java, zbierania śmieci

Dlaczego FullGC nie może uwolnić pamięci fizycznej (RES)? - Java, zbierania śmieci

Poniżej znajduje się RES krzywa wzrostu: wprowadź opis obrazu tutaj

to jest Stary gen Frakcja Occupancy: wprowadź opis obrazu tutaj

Wymuszenie pełnego GC przez jmap, stary gen rzeczywiście zmniejszył się, ale OZE rośnie ...

Wynik pmap:

wprowadź opis obrazu tutaj

Co znaczy zaraz, to jest pamięć bez sterty?

Edytować:

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

wprowadź opis obrazu tutaj

Sterty używane tylko około 500 MB, ale RSS przekracza 15 GB, pmap pokazuje, że wiele zaraz około 65 MB.

Moje pytanie brzmi: Co może pochłonąć pamięć poza stosem? Dzięki!

Odpowiedzi:

1 dla odpowiedzi № 1

JVM Oracle ma wiele algorytmów do zarządzania pamięcią. Niektóre z nich mogą zwracać nieużywane strony pamięci do systemu operacyjnego, inne nie.

Domyślny algorytm (równoległy kolektor) nigdy nie zwraca pamięci do systemu operacyjnego.

Następujące dwa algorytmy mogą zwrócić pamięć do systemu operacyjnego

  • Serial GC (single threaded mark sweep compact)
  • G1

Znajdziesz podsumowanie dostępnych algorytmów i powiązanych opcji JVM tutaj.


1 dla odpowiedzi nr 2

Jakie jest znaczenie anon, to pamięć nie-sterty?

anon po prostu znaczy, że tak było mmap()"d z MAP_ANON. Biorąc pod uwagę RSS, jest to prawdopodobnie kupa.

Dlaczego FullGC nie może uwolnić pamięci fizycznej (RES)?

Musisz rozróżnić maksymalny rozmiar sterty, obłożenie sterty i zatwierdzony rozmiar sterty.

  • maksymalny rozmiar sterty to przestrzeń adresowa, która zostanie zarezerwowana z góry, ale niekoniecznie wspierana przez strony
  • zatwierdzony rozmiar sterty będzie wspierany przez strony i zwykle wyzerowany / wstępnie obrobiony. to na ogół wpływa na Twój kanał RSS
  • occupancy to ułamek, który faktycznie zawiera obiekty zamiast zera

Tylko wtedy, gdy zatwierdzony rozmiar sterty spadnie na strony mogą być zwolniony z powrotem do systemu operacyjnego.

Decomitting / yield memory do systemu operacyjnego zależy od algorytmu GC, wersji JVM i parametrów strojenia (cele czasu pauzy, MaxHeapFreeRatio).


Pozostałe wyświetlone listy są prawdopodobnie bezpośrednimi alokacjami ByteBuffer, ale mogą to być również inne alokacje z bibliotek natywnych. Zbadanie zrzutu sterty dla java.nio.DirectByteBuffer instancje powinny zapewnić dalszy wgląd.