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

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

Ответ

Куча (Heap) — это область памяти JVM, в которой хранятся все объекты и массивы, созданные во время выполнения Java-приложения. Управление памятью в куче осуществляется автоматически сборщиком мусора (Garbage Collector, GC).

Что именно хранится в Heap:

  • Экземпляры классов (объекты), созданные оператором new.
  • Массивы (включая массивы примитивов).
  • Строковый пул (String Pool) для интернированных строк (находится внутри Heap).
  • Поля объектов (как примитивные, так и ссылки на другие объекты).

Структура Heap (поколения):

  1. Young Generation – Для недолгоживущих объектов.
    • Eden – Сюда помещаются все новые объекты.
    • Survivor Spaces (S0, S1) – Сюда перемещаются объекты, пережившие Minor GC.
  2. Old Generation (Tenured) – Для долгоживущих объектов, переживших несколько сборок в Young Generation.
  3. Metaspace (вне Heap, но управляется JVM) – Для метаданных классов (с Java 8, заменила PermGen).

Пример:

// Объект MyClass и его внутренние данные — в Heap
MyClass obj = new MyClass();

// Массив и его элементы (примитивы) — в Heap
int[] numbers = new int[]{1, 2, 3};

// Строковый литерал — ссылка из пула строк (в Heap)
String name = "Java";

// Ссылка 'obj' хранится в стеке (Stack), а сам объект — в куче.

Ключевые моменты:

  • Heap общий для всех потоков приложения.
  • Память выделяется динамически.
  • Основная причина OutOfMemoryError: Java heap space — нехватка места в куче.