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

Ответ

В Heap хранятся все объекты, созданные через new, а также массивы. Сюда попадают:

  • Объекты классов (экземпляры)
  • Массивы (включая массивы примитивов)
  • Строки (String)
  • Коллекции (List, Map и т.д.)

Пример:

// Все эти объекты попадают в Heap
String str = new String("Hello");
List<Integer> list = new ArrayList<>();
int[] array = new int[10];

Особенности:

  • Управляется Garbage Collector'ом
  • Размер ограничен памятью устройства
  • Доступ к объектам идет по ссылкам из Stack

Ответ 18+ 🔞

А, ну вот, классика жанра, ёпта! Смотри, чтобы не путаться, как последний распиздяй. Представь, что Heap — это такой огромный склад, куда ты сваливаешь всё, что создаёшь через это священное слово new. Типа, заказал новую тачку — она на парковку (в Heap) приехала. Ключи от неё (ссылка) — у тебя в кармане (в Stack).

Короче, сюда летит всё, что посерьёзнее примитивов:

  • Объекты всяких классов — ну, новые экземпляры, ясен пень.
  • Массивы — абсолютно любые, даже если там int простые лежат.
  • Строки (String) — да-да, они тоже туда, не обманывайся.
  • Коллекции (List, Map и прочая хуйня) — само собой.

Вот, смотри на код, тут всё понятно как божий день:

// Всё это добро едет прямиком в Heap, будь здоров
String str = new String("Hello"); // Строка — объект, ёбана!
List<Integer> list = new ArrayList<>(); // Коллекция — объект, что тут непонятного?
int[] array = new int[10]; // Массив, даже из примитивов, — тоже объект, мудя!

А теперь фишки, которые надо запомнить, а то будешь потом как дурак:

  • Управляется Garbage Collector'ом. Это как дворник-алкаш. Он просыпается, когда память кончается, и начинает мести всё, на что нет ключей (активных ссылок). Может твою любимую тачку утилизировать, если ты ключи потерял. Волнение ебать!
  • Размер ограничен памятью устройства. Не резиновый этот склад. Если накидать овердохуища объектов — получишь OutOfMemoryError, и программа накрывается медным тазом. Красота.
  • Доступ к объектам идёт по ссылкам из Stack. Это самое главное! Сам объект лежит в куче, а у тебя в стеке (в локальной переменной метода) — только бумажка с адресом, где этот объект искать. Потерял бумажку — считай, объект тебе больше не принадлежит, скоро дворник его приберёт.

Вот и вся магия. Не такой уж и пиздец, если разобраться. Главное — не создавай объекты как сумасшедший, а то Garbage Collector устанет и начнёт бухтеть, а память кончится.