CodeGym/Kursy Java/Moduł 3/Zbieranie śmieci w Javie

Zbieranie śmieci w Javie

Dostępny

Przypomnij sobie, czym jest wyrzucanie elementów bezużytecznych w Javie

Wyrzucanie elementów bezużytecznych to proces odzyskiwania pełnej pamięci wykonawczej poprzez niszczenie nieużywanych obiektów.

Czasami programista może zapomnieć o zniszczeniu bezużytecznych obiektów, a przydzielona im pamięć nie zostaje zwolniona. Coraz więcej pamięci systemowej jest zużywane iw końcu nie jest już przydzielana. Takie aplikacje cierpią z powodu „wycieków pamięci”.

Po pewnym momencie nie ma już wystarczającej ilości pamięci do tworzenia nowych obiektów, a program kończy się nieprawidłowo z powodu błędu OutOfMemoryError .

Wyrzucanie elementów bezużytecznych w Javie to proces, za pomocą którego programy Java automatycznie zarządzają pamięcią. Programy Java są kompilowane do kodu bajtowego, który działa na wirtualnej maszynie Java (JVM).

Gdy programy Java działają na maszynie JVM, obiekty są tworzone na stercie, która jest częścią przydzielonej im pamięci.

Podczas działania aplikacji Java tworzone są w niej nowe obiekty. W końcu niektóre przedmioty nie są już potrzebne. Można powiedzieć, że w dowolnym momencie pamięć sterty składa się z dwóch rodzajów obiektów.

  • Na żywo — te obiekty są używane, odwołuje się do nich z innego miejsca.
  • Martwe - te obiekty nie są używane nigdzie indziej, nie ma do nich żadnych odniesień.

Moduł wyrzucania elementów bezużytecznych znajduje te nieużywane obiekty i usuwa je, aby zwolnić pamięć.

Wyrzucanie elementów bezużytecznych w Javie jest procesem automatycznym . Programista nie musi jednoznacznie oznaczać obiektów do usunięcia.

Każda JVM może zaimplementować własną wersję wyrzucania elementów bezużytecznych. Jednak moduł zbierający musi być zgodny ze standardową specyfikacją maszyny JVM w zakresie postępowania z obiektami obecnymi w pamięci sterty w celu oznaczania lub identyfikowania nieosiągalnych obiektów i niszczenia ich poprzez zagęszczanie.

Osiągalność obiektu

Aby uznać obiekt za żywy, sama obecność powiązań nie wystarczy. Dzieje się tak, ponieważ niektóre martwe obiekty mogą odnosić się do innych martwych obiektów. Dlatego konieczne jest, aby wśród wszystkich odniesień do obiektu znalazło się przynajmniej jedno z „żywego” obiektu.

Osiągalność obiektu

Garbage collectory działają z koncepcją GC Roots ( korzenie zbierania śmieci ) w celu rozróżnienia żywych i martwych obiektów. Istnieją w 100% żywe obiekty, az nich są linki, które animują inne obiekty i tak dalej.

Przykłady takich korzeni:

  • Klasy ładowane przez program ładujący klasy systemowe.
  • Transmisja na żywo.
  • Parametry aktualnie wykonywanych metod i zmienne lokalne.
  • Obiekty używane jako monitor do synchronizacji.
  • Obiekty, które są zachowane z wyrzucania elementów bezużytecznych w jakimś celu.
  • Moduł wyrzucania elementów bezużytecznych przechodzi przez cały wykres obiektów w pamięci, zaczynając od tych korzeni i podążając za odniesieniami do innych obiektów.

Kroki zbierania śmieci w Javie

Standardowa implementacja wyrzucania elementów bezużytecznych składa się z trzech kroków.

1. Oznacz obiekty jako aktywne

W tym momencie moduł wyrzucania elementów bezużytecznych (GC) musi zidentyfikować wszystkie żywe obiekty w pamięci, przechodząc przez graf obiektów.

Kiedy odwiedza obiekt, oznacza go jako dostępny, a zatem żywy. Wszystkie obiekty, które nie są dostępne z korzeni GC, są uważane za kandydatów do wyrzucania elementów bezużytecznych.

2. Sprzątanie martwych przedmiotów

Po fazie znaczników przestrzeń pamięci jest zajęta albo żywymi (odwiedzonymi), albo martwymi (nieodwiedzonymi) obiektami. Faza oczyszczania uwalnia fragmenty pamięci zawierające martwe obiekty.

3. Zwarty układ pozostałych obiektów w pamięci

Nie jest konieczne, aby martwe obiekty usunięte w poprzedniej fazie znajdowały się obok siebie. W ten sposób ryzykujesz uzyskanie pofragmentowanej (w połowie pustej) przestrzeni pamięci.

Ale oczywiście, mając to na uwadze, możliwe jest kompaktowanie pamięci w momencie, gdy moduł wyrzucania elementów bezużytecznych usuwa martwe obiekty. Reszta zostanie umieszczona w ciągłym bloku na początku sterty.

Proces zagęszczania ułatwia sekwencyjne przydzielanie pamięci dla nowych obiektów.

Komentarze
  • Popularne
  • Najnowsze
  • Najstarsze
Musisz się zalogować, aby dodać komentarz
Ta strona nie ma jeszcze żadnych komentarzy