0Pricing
Java Academy · Урок

Области кучи JVM и жизненный цикл объектов

Изучите молодое поколение (Eden, Survivor), старое поколение и Metaspace, а также перемещение объектов между ними.

«Области кучи JVM и жизненный цикл объектов» — бесплатный урок Java Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Java Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Java Academy содержит 4 уроков всего.

Модель памяти JVM

JVM разделяет память на несколько областей. Куча содержит все экземпляры классов и массивы. Области вне кучи включают Metaspace, где хранятся метаданные классов, кадры стека и нативную память.

Молодое поколение: область Эдема

Вновь выделенные объекты попадают в область Эдема. Когда она заполняется, выполняется малая сборка мусора. Сохранившиеся объекты копируются в область выживших объектов.

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

Области выживших объектов: S0 и S1

Две области выживших объектов (S0 и S1) содержат объекты, пережившие хотя бы одну сборку мусора. При каждой малой сборке мусора объекты переходят из S0 в S1 и обратно. Счётчик их возраста увеличивается.

Порог старения

Когда возраст объекта превышает порог старения (по умолчанию 15), объект перемещается в старое поколение. Крупные объекты могут пропустить молодое поколение и сразу попасть в старое.

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

Старое поколение (область долгоживущих объектов)

Долгоживущие объекты находятся в старом поколении. Основные, или полные, сборки мусора очищают старое поколение и обходятся дороже. Уменьшение числа долгоживущих объектов снижает частоту полных сборок мусора.

Metaspace (Java 8+)

Metaspace заменила PermGen в Java 8. В ней хранятся метаданные классов, байт-код методов и интернированные строки. Она использует нативную память и динамически увеличивается, но ограничивается параметром -XX:MaxMetaspaceSize.

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

Быстрый путь выделения объектов

JVM использует буферы распределения, локальные для потока, чтобы выделять память из области Эдема без синхронизации. У каждого потока есть собственный небольшой участок области Эдема.

Жизненный цикл объекта: достижимость

Объект считается живым, если он достижим из корня сборщика мусора — переменной стека, статического поля или ссылки JNI. Недостижимые объекты могут быть собраны.

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

Мягкие, слабые и фантомные ссылки

SoftReference очищается перед OOM и используется для кэшей. WeakReference очищается при следующей сборке мусора. PhantomReference используется для очистки после завершения жизненного цикла объекта.

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

Финализация объектов (избегайте её)

finalize() устарел и непредсказуем: сборщик мусора вызывает его перед сборкой объекта, но время вызова не гарантируется. Вместо этого используйте Cleaner (Java 9+) или конструкцию автоматического закрытия ресурсов.

Флаги настройки кучи

Управляйте размером кучи с помощью -Xms (начальный размер) и -Xmx (максимальный размер). В рабочей среде задавайте одинаковые значения, чтобы избежать пауз при изменении размера кучи.

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

Быстрая проверка

Где во время первого размещения находится вновь созданный объект в куче JVM?

Повторение

Куча JVM состоит из молодого поколения (Эдем и области выживших объектов) и старого поколения. Объекты стареют в ходе малых сборок мусора и перемещаются в старое поколение. В Metaspace хранятся метаданные классов. Управляйте памятью с помощью -Xms/-Xmx и флагов настройки.

Часто задаваемые вопросы

Урок «Области кучи JVM и жизненный цикл объектов» бесплатный?

Да — полный текст урока «Области кучи JVM и жизненный цикл объектов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Java Academy, подпишись на CoddyKit PRO. Курс Java Academy содержит 4 уроков всего.

Чему я научусь в уроке «Области кучи JVM и жизненный цикл объектов»?

Изучите молодое поколение (Eden, Survivor), старое поколение и Metaspace, а также перемещение объектов между ними. Ты практикуешь Java Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Java Academy?

Предыдущий опыт не требуется. Java Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Области кучи JVM и жизненный цикл объектов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Java Academy?

Да. Каждый урок Java Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Области кучи JVM и жизненный цикл объектов
  2. Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah
  3. Обнаружение и устранение утечек памяти
  4. Флаги настройки сборки мусора и профилирование в JVisualVM
← Назад к Java Academy