← Назад к вопросам

Что хранится в куче?

1.0 Junior🔥 131 комментариев
#Soft Skills и карьера

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

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

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

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

В куче хранятся все объекты:

String name = "John";              // объект String в heap
ArrayList<String> list = new ArrayList<>();  // объект ArrayList в heap
Person person = new Person("Alice"); // объект Person в heap
int[] array = new int[100];         // объект массива в heap
HashMap<String, Integer> map = new HashMap<>(); // объект HashMap в heap

Крайне важно понимать: переменные хранятся в Stack, но сами объекты — в Heap. Переменная содержит только ссылку (адрес) на объект в heap.

Примеры объектов в Heap

// Все это будет в heap:
String message = "Hello";            // String object
Integer number = 42;                 // Integer object (обёрнут примитив)
List<String> items = new ArrayList<>();  // ArrayList object
CustomClass instance = new CustomClass(); // ваш объект
int[] arr = {1, 2, 3};               // объект массива

Характеристики Heap

Размер: Гораздо больше, чем Stack. Может быть настроен при запуске JVM через параметр -Xmx (максимальный размер):

java -Xmx2g -Xms512m MyApp  // max 2GB, initial 512MB

Управление памятью: Автоматическое через Garbage Collector (GC). При удалении ссылок на объект, он становится доступен для сборки мусора:

String text = new String("Hello");  // объект создан в heap
text = null;                        // ссылка удалена
// Объект теперь может быть собран GC

Многопоточность: Heap разделяется между потоками, поэтому нужна синхронизация:

public class Counter {
    private int value = 0;  // это поле хранится в объекте, который в heap
    
    public synchronized void increment() {
        value++;
    }
}

Утечки памяти в Heap

Если вы удерживаете ссылки на неиспользуемые объекты, они остаются в heap и не могут быть собраны:

List<String> cache = new ArrayList<>();
for (int i = 0; i < 1_000_000; i++) {
    cache.add("Item " + i);  // ссылки не удаляются - утечка!
}

Структура Heap

Modern JVM использует поколенческую сборку мусора (Generational GC):

  • Young Generation — для новых объектов (быстрая сборка)
  • Old Generation — для долгоживущих объектов
  • Permanent Generation (Metaspace в Java 8+) — для метаинформации класса

Заключение

Heap содержит все объекты программы и управляется автоматически Garbage Collector. Понимание того, как объекты хранятся в куче, критично для написания эффективного и безопасного по памяти кода. Утечки памяти возникают, когда вы удерживаете ненужные ссылки на объекты в heap.