0Pricing
Java Academy · Lekcja

Obszary sterty JVM i cykl życia obiektów

Poznaj Young Generation (Eden, Survivor), Old Generation i Metaspace oraz dowiedz się, jak obiekty przemieszczają się między nimi.

Obszary sterty JVM i cykl życia obiektów to bezpłatna lekcja Java Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Java Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Java Academy zawiera 4 lekcji w sumie.

Model pamięci JVM

JVM dzieli pamięć na kilka obszarów. Sterta przechowuje wszystkie instancje klas i tablice. Obszary poza stertą obejmują Metaspace (metadane klas), ramki stosu i pamięć natywną.

Młoda generacja: obszar Eden

Nowo przydzielone obiekty trafiają do obszaru Eden. Gdy Eden się zapełni, uruchamiane jest Minor GC. Obiekty, które przetrwały, są kopiowane do obszaru Survivor.

// Object allocation starts in Eden:
String s = new String("hello");  // allocated in Eden
List<Integer> list = new ArrayList<>();  // also Eden

Obszary Survivor: S0 i S1

Dwa obszary Survivor (S0 i S1) przechowują obiekty, które przetrwały co najmniej jedno GC. Podczas każdego Minor GC obiekty przechodzą naprzemiennie między S0 i S1. Ich licznik wieku jest zwiększany.

Próg tenuringu

Gdy wiek obiektu przekroczy próg tenuringu (domyślnie 15), obiekt jest promowany do starej generacji. Duże obiekty mogą pominąć młodą generację i trafić bezpośrednio do starej generacji.

// JVM flags:
// -XX:MaxTenuringThreshold=15  (default)
// -XX:PretenureSizeThreshold=1m  (objects > 1MB go directly to Old Gen)

Stara generacja (Tenured Space)

Długowieczne obiekty znajdują się w starej generacji. Główne kolektory (Full GC) zbierają obiekty ze starej generacji i są bardziej kosztowne. Ograniczenie liczby długowiecznych obiektów zmniejsza częstotliwość Full GC.

Metaspace (Java 8+)

Metaspace zastąpił PermGen w Javie 8. Przechowuje metadane klas, bajtkod metod i zainternowane ciągi znaków. Korzysta z pamięci natywnej i rośnie dynamicznie, a jego rozmiar ogranicza -XX:MaxMetaspaceSize.

// Flag examples:
// -XX:MetaspaceSize=64m        (initial Metaspace size)
// -XX:MaxMetaspaceSize=256m   (cap to avoid native OOM)

Szybka ścieżka alokacji obiektów

JVM używa buforów alokacji lokalnych dla wątku (Thread-Local Allocation Buffers, TLAB), aby przydzielać pamięć z obszaru Eden bez synchronizacji. Każdy wątek ma własny, niewielki fragment obszaru Eden.

Cykl życia obiektu: osiągalność

Obiekt jest żywy, jeśli można do niego dotrzeć z katalogu głównego GC (zmiennej stosu, pola statycznego lub referencji JNI). Obiekty nieosiągalne są kandydatami do zebrania.

Object a = new Object(); // reachable via local variable
a = null;                 // now unreachable — eligible for GC

Referencje miękkie, słabe i fantomowe

SoftReference jest czyszczona przed wystąpieniem OOM (używa się jej w cache'ach). WeakReference jest czyszczona podczas następnego GC. PhantomReference służy do sprzątania po zakończeniu życia obiektu.

Cache<String, Image> cache = new LinkedHashMap<>();
// Use SoftReference to let GC reclaim cache under memory pressure:
SoftReference<Image> ref = new SoftReference<>(loadHeavyImage());
Image img = ref.get(); // null if GC collected it

Finalizacja obiektów (unikać)

finalize() jest przestarzała i nieprzewidywalna — GC wywołuje ją przed zebraniem obiektu, ale czas wywołania nie jest gwarantowany. Zamiast niej należy używać Cleaner (Java 9+) lub konstrukcji try-with-resources.

Flagi rozmiaru sterty

Rozmiarem sterty sterują opcje -Xms (początkowy) i -Xmx (maksymalny). W środowisku produkcyjnym należy ustawić je na tę samą wartość, aby uniknąć pauz związanych ze zmianą rozmiaru sterty.

// Recommended production flags:
// -Xms512m -Xmx512m   (fix heap to 512 MB)
// -XX:NewRatio=2       (Old:Young = 2:1)

Szybkie sprawdzenie

Gdzie na stercie JVM znajduje się najpierw nowo przydzielony obiekt?

Podsumowanie

Sterta JVM obejmuje młodą generację (Eden i obszary Survivor) oraz starą generację. Obiekty starzeją się podczas Minor GC i są promowane. Metaspace przechowuje metadane klas. Rozmiarem sterty można sterować za pomocą -Xms/-Xmx i flag dostrajania.

Często zadawane pytania

Czy lekcja „Obszary sterty JVM i cykl życia obiektów” jest bezpłatna?

Tak — pełny tekst „Obszary sterty JVM i cykl życia obiektów” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Java Academy, przejdź na CoddyKit PRO. Kurs Java Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Obszary sterty JVM i cykl życia obiektów”?

Poznaj Young Generation (Eden, Survivor), Old Generation i Metaspace oraz dowiedz się, jak obiekty przemieszczają się między nimi. Ćwiczysz Java Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Java Academy?

Nie wymagamy żadnego doświadczenia. Java Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.

Ile czasu zajmuje lekcja „Obszary sterty JVM i cykl życia obiektów”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Java Academy?

Tak. Każda lekcja Java Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Obszary sterty JVM i cykl życia obiektów
  2. Algorytmy GC: Serial, G1, ZGC, Shenandoah
  3. Wykrywanie i naprawianie wycieków pamięci
  4. Flagi dostrajania GC i profilowanie w JVisualVM
← Powrót do Java Academy