Какие основные области памяти (memory areas) управляются JVM?

«Какие основные области памяти (memory areas) управляются JVM?» — вопрос из категории Java Core, который задают на 24% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

JVM разделяет память на несколько ключевых областей, каждая со своей целью и жизненным циклом:

Область Назначение Управление Ключевые особенности
Heap (Куча) Хранение всех объектов и массивов. Сборщик мусора (Garbage Collector). Делится на Young Generation (Eden, Survivor spaces) и Old Generation. Основная область работы GC.
Stack (Стек) Хранение локальных переменных (примитивы, ссылки) и вызовов методов для каждого потока. Автоматически (при выходе из метода кадр стека удаляется). Каждый поток имеет свой стек. Переполнение вызывает StackOverflowError.
Metaspace Хранение метаданных классов (структуры классов, методы, константы пула). JVM (нативная память ОС). Заменила PermGen (до Java 8). Динамически растет в пределах, заданных -XX:MaxMetaspaceSize.
Native Memory (Off-Heap) Память, выделяемая JVM или приложением, но вне кучи. Программист / JNI / NIO. Используется, например, DirectByteBuffer или большие структуры через JNI. Не управляется GC Java.

Пример и объяснение:

public class Example {
    private Object instance = new Object(); // Объект -> Heap

    public void method() {
        int localVar = 42;          // Примитив -> Stack (кадр метода 'method')
        Object ref = instance;      // Ссылка 'ref' -> Stack, сам объект -> Heap
    }
}

Почему это важно? Понимание областей памяти критично для:

  • Производительности: Настройка размеров кучи (-Xmx, -Xms) и Metaspace.
  • Отладки: Анализ OutOfMemoryError (Heap vs Metaspace vs Native).
  • Многопоточности: Локальные переменные потока изолированы в его стеке.