Ответ
Куча (Heap) — это область памяти JVM, в которой хранятся все объекты и массивы, созданные во время выполнения Java-приложения. Управление памятью в куче осуществляется автоматически сборщиком мусора (Garbage Collector, GC).
Что именно хранится в Heap:
- Экземпляры классов (объекты), созданные оператором
new. - Массивы (включая массивы примитивов).
- Строковый пул (String Pool) для интернированных строк (находится внутри Heap).
- Поля объектов (как примитивные, так и ссылки на другие объекты).
Структура Heap (поколения):
- Young Generation – Для недолгоживущих объектов.
- Eden – Сюда помещаются все новые объекты.
- Survivor Spaces (S0, S1) – Сюда перемещаются объекты, пережившие Minor GC.
- Old Generation (Tenured) – Для долгоживущих объектов, переживших несколько сборок в Young Generation.
- 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— нехватка места в куче.