Области кучи 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 — локальная установка не требуется.
Все уроки этого курса
- Области кучи JVM и жизненный цикл объектов
- Алгоритмы сборки мусора: Serial, G1, ZGC и Shenandoah
- Обнаружение и устранение утечек памяти
- Флаги настройки сборки мусора и профилирование в JVisualVM