Что такое Heap (куча) в контексте памяти JVM?

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

Ответ

Heap (куча) — это область оперативной памяти (RAM), выделяемая JVM для динамического хранения всех объектов и массивов, создаваемых во время выполнения Java-приложения.

Ключевые характеристики:

  • Динамическое выделение: Память под объекты выделяется во время выполнения оператором new.
  • Сборка мусора (Garbage Collection, GC): Управление памятью автоматическое. Объекты, на которые нет ссылок, удаляются GC.
  • Разделение на поколения: Оптимизирует работу GC.
    • Young Generation (Eden, Survivor Spaces): Для недолгоживущих объектов.
    • Old Generation (Tenured): Для долгоживущих объектов.
  • Общая для всех потоков: Все потоки приложения разделяют одну кучу.

Пример и визуализация:

// Объект 'myObject' создается в куче (Heap)
MyClass myObject = new MyClass();
// Ссылка 'myObject' хранится в стеке (Stack), а сам объект — в куче.

Управление размером Heap (JVM флаги):

  • -Xms — начальный размер кучи (например, -Xms256m).
  • -Xmx — максимальный размер кучи (например, -Xmx2g).

Ошибки: OutOfMemoryError: Java heap space возникает, когда приложение исчерпывает выделенную кучу и GC не может освободить достаточно памяти.

Важно: Помимо кучи, JVM использует другие области памяти: Stack (для примитивов и ссылок на объекты в рамках вызовов методов), Metaspace (для метаданных классов), Native Memory.