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 EdenObszary 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 GCReferencje 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 itFinalizacja 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
- Obszary sterty JVM i cykl życia obiektów
- Algorytmy GC: Serial, G1, ZGC, Shenandoah
- Wykrywanie i naprawianie wycieków pamięci
- Flagi dostrajania GC i profilowanie w JVisualVM