JVM: вопросы с ответами

29 разобранных вопросов по теме «JVM». Каждый — с правильным ответом и пояснением.

  • Classloader: parent delegation model?

    Bootstrap → Platform (ext) → Application. Дочерний сначала делегирует родителю, потом грузит сам.

  • Escape analysis — что это даёт?

    JIT определяет, «сбегает» ли объект из метода. Если нет — может аллоцировать на стеке вместо heap (scalar replacement).

  • Generational ZGC — что нового?

    ZGC с Java 21 стал generational (раздельная сборка Young/Old по слабой гипотезе о поколениях). Паузы <1ms даже на терабайтных heap, при этом Old тоже собирается конкурентно. Предыдущий ZGC был non-generational (собирал весь heap). Generational ZGC — стандарт для high-load в 2026.

  • JDK, JRE, JVM?

    JVM — виртуальная машина (исполняет байт-код). JRE = JVM + библиотеки. JDK = JRE + инструменты. С Java 9 JRE отдельно не поставляется. Java 21: Virtual Threads, Records, Sealed Classes, Pattern Matching.

  • JVM, JRE, JDK — в чём разница?

    JVM — виртуальная машина. JRE = JVM + библиотеки. JDK = JRE + инструменты разработки (javac, jdb).

  • Что такое WeakReference / SoftReference / PhantomReference?

    Weak — GC собирает при первой же сборке. Soft — GC собирает при нехватке памяти (для кэшей). Phantom — для постфинализационной очистки ресурсов. WeakHashMap — ключи через WeakReference.

  • Young / Old generation — как работает поколенческая сборка?

    Young: Eden + 2 Survivor. После нескольких переживаний minor GC — объект попадает в Old.

  • В чём разница StackOverflowError и OutOfMemoryError?

    StackOverflowError — переполнение стека потока, возникает при бесконечной рекурсии или очень глубоких вызовах; размер стека невелик и задаётся флагом -Xss. OutOfMemoryError — нехватка памяти, чаще всего в куче (heap), размер которой задаётся флагом -Xmx.

  • В чём разница между JDK, JRE и JVM?

    JVM — виртуальная машина (исполняет байт-код). JRE = JVM + стандартные библиотеки (нужно для запуска). JDK = JRE + инструменты разработки (javac, jdb, jar).

  • Что такое Виды OutOfMemoryError?

    Java heap space, Metaspace, Unable to create new native thread, GC overhead limit exceeded.

  • Виды ссылок: Strong, Soft, Weak, Phantom?

    Strong: обычная, GC не трогает. Soft: GC собирает при нехватке памяти (кэши). Weak: GC собирает при первой же сборке независимо от памяти (WeakHashMap). Phantom: get() всегда null, уведомление через ReferenceQueue для постфинализационной очистки.

  • Где хранятся статические поля?

    В Metaspace. До Java 8 это была область PermGen (часть heap), с Java 8 — отдельная область в нативной памяти (off-heap). Это важно: при анализе утечек статические поля не видны в обычном дампе heap.

  • Из чего состоит память Java?

    Основные области: Heap (куча) — здесь живут все объекты, включая их поля. Stack (стек) — у каждого потока свой, хранит локальные переменные и фреймы вызовов. Metaspace (с Java 8 заменил PermGen) — метаданные классов и статические поля, лежит в нативной памяти вне кучи. Young/Old — это поколения внутри Heap.

  • Как GC решает, что объект можно удалить?

    По достижимости от GC Roots. GC Roots — статические поля, локальные переменные стека, активные потоки, JNI-ссылки. Если до объекта нельзя добраться по ссылкам от GC Roots — он мусор и будет собран.

  • Как воспроизвести OOM?

    static Map без eviction: статический Map, добавляешь объекты в цикле → heap exhaustion. Бесконечное создание Thread: каждый поток = ~1MB стека → native OOM. Metaspace: динамическая генерация классов (CGLIB, ASM) переполняет область метаданных. А бесконечная рекурсия даёт StackOverflowError, а не OutOfMemoryError.

  • Как делится Heap?

    Young Generation — новые объекты. Состоит из Eden (где создаются), Survivor 0, Survivor 1 (для тех, что пережили несколько Minor GC). Old Generation — долгоживущие объекты, которые пережили много циклов GC.

  • Как диагностировать утечку памяти?

    Heap dump (jmap, -XX:+HeapDumpOnOutOfMemoryError) → анализ в Eclipse MAT или VisualVM.

  • Какие бывают сборщики мусора?

    Serial, Parallel, CMS (deprecated с Java 9, удалён в Java 14), G1 (default с Java 9), ZGC, Shenandoah. Для low-latency выбирают ZGC/Shenandoah.

  • Какие виды ссылок в Java?

    Strong (обычная new) — пока есть Strong-ссылка, объект не соберётся. Soft (SoftReference) — собирается, когда не хватает памяти, для кэшей. Weak (WeakReference) — собирается при следующей сборке, даже если есть память. Phantom (PhantomReference) — для пост-mortem очистки, get() всегда возвращает null.

  • Какие области памяти в JVM? Что хранится в heap, а что в stack?

    Heap — объекты и массивы; stack — фреймы методов, примитивы, ссылки.

  • Какие сборщики мусора ты знаешь?

    Serial — однопоточный, для маленьких приложений. Parallel — многопоточный для Young, был дефолтом до Java 9. G1 (Garbage First) — с Java 9 дефолт, делит heap на регионы, низкие паузы. ZGC и Shenandoah — для больших heap с сверхнизкими паузами.

  • Что такое Области памяти JVM?

    Heap — хранение объектов, управляется GC, общий для всех потоков. Stack — фрейм для каждого вызова метода (локальные переменные, ссылки, примитивы), приватный для потока. Metaspace (до Java 8 — PermGen) — метаданные классов в нативной памяти, вне Heap.

  • Структура памяти JVM: где что хранится?

    Heap: объекты, общий для всех потоков (Young=Eden+Survivor, Old). Stack: фреймы методов (на каждый поток свой, LIFO), примитивы, ссылки. Metaspace: метаданные классов, статические поля (вне Heap, в нативной памяти с Java 8). Code Cache: JIT-скомпилированный код.

  • Циклические ссылки — соберутся?

    Да. Java GC работает по reachability, а не по reference counting. Два объекта, ссылающиеся друг на друга, но не достижимые снаружи — будут собраны. Это отличие от Python, где есть reference counting + cycle collector.

  • Чем отличаются JVM, JRE и JDK?

    JVM (Java Virtual Machine) — виртуальная машина, которая исполняет байткод. Содержит GC и JIT-компилятор. JRE (Java Runtime Environment) — JVM + стандартные библиотеки (java.lang, java.util и т.д.). JDK (Java Development Kit) — JRE + инструменты разработки (javac, javadoc, jdb). Матрёшка: JVM ⊂ JRE ⊂ JDK.

  • Что такое JDK, JRE, JVM?

    JVM — виртуальная машина, исполняет байт-код. JRE = JVM + стандартные библиотеки (нужно для запуска). JDK = JRE + инструменты разработки: javac, jdb, jar. С Java 9 JRE как отдельный дистрибутив не поставляется.

  • Что такое JIT-компиляция?

    Оптимизация «горячего» кода в нативный. C1 — быстрый прогрев, C2 — агрессивная оптимизация.

  • Что такое Minor GC и Major GC?

    Minor GC — собирает Young Generation. Быстро (миллисекунды), Stop-The-World, но коротко. Major GC — собирает Old Generation, медленнее. Full GC — весь heap + Metaspace. Тревожное событие, если случается часто.

  • Что такое Stop-the-World?

    Пауза приложения для сборки мусора. У ZGC и Shenandoah паузы < 10 мс даже на огромных heap'ах.

новые гайды и свежие вопросы с собесов — первыми в Telegram Смотреть гайды Подписаться