Что такое Heap в JVM?

«Что такое Heap в JVM?» — вопрос из категории Java, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Ключевые особенности:

  • Управляется сборщиком мусора (Garbage Collector, GC).
  • Общая для всех потоков приложения.
  • Разделена на поколения для оптимизации работы GC:
    • Young Generation (Молодое поколение): Сюда помещаются новые объекты. Состоит из Eden и двух Survivor пространств. Частые минорные сборки мусора (Minor GC).
    • Old Generation (Старое поколение): Сюда перемещаются объекты, пережившие несколько циклов сборки в Young Generation. Сбор мусора здесь (Major GC) происходит реже, но занимает больше времени.
    • Metaspace (до Java 8 — Permanent Generation): Хранит метаданные классов.

Пример и наблюдение:

// Создание объектов, которые попадают в heap
List<String> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
    list.add("Object_" + i); // Каждая строка — новый объект в heap
}
// Когда ссылка `list` перестает быть достижимой,
// эти объекты становятся кандидатами на удаление сборщиком мусора.

Почему это важно: Понимание структуры Heap и работы GC критично для диагностики и предотвращения проблем с производительностью и утечками памяти (OutOfMemoryError).