Garbage Collector Javy 1/5

Tłumaczenie 9-tego rozdziału “Inside the Java Virtual Machine” napisanego przez Billa Vennersa znajdującego się na http://www.artima.com/insidejvm/ed2/gcP.html

Sterta maszyny wirtualnej Javy przechowuje wszystkie obiekty tworzone przez działająca aplikację Javy. Obiekty są tworzone przez instrukcje new, newarray, anewarray i multianewarray ale nigdy nie są zwalniane jawnie przez kod. Odśmiecanie (garbage collection) jest procesem automatycznego zwalniania obiektów do których program już się nie odwołuje.

Ten rozdział nie opisuje oficjalnej sterty odśmiecania pamięci Javy bo taka nie istnieje. Jak wspomniano we wcześniejszych rozdziałach, specyfikacja maszyny wirtualnej Javy nie wymaga szczególnej techniki zbierania śmieci. Nie wymaga nawet zbierania śmieci w ogóle. Ale ponieważ nie wynaleziono nieskończonej pamięci, większość implementacji wirtualnej maszyny Javy będzie prawdopodobnie działać ze stertą zbierania śmieci. Ten rozdział opisuje różne techniki odśmiecania i wyjaśnia jak odśmiecanie działa w wirtualnych maszynach Javy.
Dostępny jest aplet który interaktywnie ilustruje materiał tutaj prezentowany. Applet nazwany Heap of Fish.

Czytaj dalej Garbage Collector Javy 1/5

Garbage Collector Javy 2/5

Odśmiecacze pokoleniowe
Jedną z wad prostych odśmiecaczy typu “stop and copy” jest to, że wszystkie żywe obiekty muszą być kopiowane przy każdym sprzątaniu. Ten aspekt kopiujących algorytmów może być poprawiony biorąc pod uwagę dwa fakty, które zostały empirycznie obserwowane w większości programów w różnych językach:
  1. Większość obiektów tworzonych przez większość programów ma bardzo krótkie życie.
  2. Większość programów tworzy niewiele obiektów które mają bardzo długie życie. Głównym źródłem nieefektywności prostych kopiujących odśmiecaczy jest to że spędzają dużo czasu kopiując te same długo żyjące obiekty znowu i znowu.

Odśmiecacze pokoleniowe radzą sobie z tą nieefektywnością przez grupowanie obiektów ze względu na wiek i sprzątanie młodszych obiektów częściej niż starszych. W ramach tego podejścia sterta jest dzielona na dwie lub więcej mniejszych stert, z których każda obsługuje jedno “pokolenie” obiektów. Najmłodsza generacja jest sprzątana najczęściej. Ponieważ większość obiektów jest krótko żyjąca, jedynie mały procent młodych obiektów ma szansę na szansę przetrwania pierwszego sprzątania. Skoro obiekt przetrwał kilka sprzątań jako członek najmłodszej generacji, obiekt jest awansowany do następnej generacji: jest przenoszony do innej podsterty. Każde starsze pokolenie jest czyszczone rzadziej niż młodsze. Jako obiekty “starsze” (przetrwały wiele czyszczeń) w bieżącym pokoleniu są przemieszczane do starszego pokolenia.

Czytaj dalej Garbage Collector Javy 2/5

Garbage Collector Javy 3/5

Finalizacja
W Javie obiekt może posiadać finalizator: metodę którą garbage collector musi uruchomić przed zwolnieniem obiektu. Potencjalne istnienie finalizatorów komplikuje pracę garbage collectora w wirtualnej maszynie Javy.
Aby dodać finalizator do klasy wystarczy po prostu zadeklarować metodę w tej klasie następująco:
// Na CD-ROM w pliku gc/ex2/Example2.java
class Example2 {

    protected void finalize() throws Throwable {
        //...
        super.finalize();
    }
    //...
 Czytaj dalej Garbage Collector Javy 3/5

Garbage Collector Javy 4/5

Zmiany stanu osiągalności
Jak wspomniano wcześniej, obiekty referencyjne są po to by móc trzymać referencję do obiektów które garbage collector może zwolnić. Innymi słowy garbage collector może zmienić stan osiągalności każdego obiektu który nie jest silnie osiągalny. Ponieważ często jest ważne aby śledzić zmiany stanu osiągalności powodowane przez garbage collector, kiedy trzymasz miękkie, słabe lub fantomowe referencje, możesz nakazać powiadamiać o takich zmianach. Aby zarejestrować zainteresowanie zmianami dostępności, kojarzy się obiekty referencyjne z kolejkami referencyjnymi. Kolejka referencyjna jest instancją klasy java.lang.ref.ReferenceQueue do której garbage collector dołącza obiekty referencyjne pociągając zmiany stanu osiągalności. Poprzez ustanowienie i monitorowanie kolejki odniesienia, możesz zostać powiadomiony o interesujących zmianach stanu dostępności wykonywanych asynchronicznie przez garbage collector.
Czytaj dalej Garbage Collector Javy 4/5

Garbage Collector Javy 5/5

Heap of Fish: Symulacja

Aplet Heap of Fish przedstawiony na rysunkach 9-2 do 9-5 wykazuje kompaktowanie, zaznaczanie i zamiatanie odśmiecanej sterty. Aby ułatwić kompaktowanie, sterta ta używa pośrednich uchwytów do obiektów zamiast bezpośrednich odniesień. Nazywa się Heap of Fish ponieważ jedynym typem obiektów przechowywanych na stercie dla tej demonstracji są obiekty ryb określone w następujący sposób:
Czytaj dalej Garbage Collector Javy 5/5