Какие данные хранятся в куче (heap) памяти Java?

Ответ

В куче (heap) хранятся все объекты и массивы, созданные во время выполнения программы с помощью оператора new.

Пример размещения в куче:

MyClass obj = new MyClass(); // Экземпляр объекта MyClass — в куче.
int[] numbers = new int[100]; // Массив из 100 целых чисел — в куче.
String text = "Hello";       // Объект строки из пула строк — в куче.

Ключевые принципы:

  • Примитивные типы (int, char, boolean и т.д.), объявленные как локальные переменные, хранятся в стеке.
  • Ссылки на объекты (переменные obj, numbers, text) также хранятся в стеке, но сами объекты, на которые они указывают, — всегда в куче.
  • Куча является общей областью памяти для всех потоков приложения и управляется сборщиком мусора (Garbage Collector, GC), который автоматически освобождает память от неиспользуемых объектов.

Ответ 18+ 🔞

А, слушай, вот эта вся тема с кучей и стеком — это ж классика, блядь, как "Муму" Тургенева, только про память! Ну, представь себе, что твоя программа — это такой Герасим, здоровый мужик, который работает.

Вот есть у него куча (heap). Это как его личный сарай, блядь, огромный, куда он складывает всё, что создаёт оператором new. Всё большое, объёмное, что будет жить долго (или не очень).

Смотри, как это выглядит, на примере:

MyClass obj = new MyClass(); // Экземпляр объекта MyClass — в сарай, в кучу, блядь!
int[] numbers = new int[100]; // Массив на сотню циферок — тоже в кучу, овердохуища места займёт!
String text = "Hello";       // И эта строка, хоть и в пуле, но объект — её домик тоже в куче!

А теперь, ёпта, ключевой момент, чтобы не запутаться, как Герасим с немотой!

  • Примитивные типы (int, char, boolean и прочая мелочь), если они объявлены прямо в методе — это как его личные инструменты в кармане. Лежат в стеке, под рукой, быстро достал — быстро использовал.
  • Ссылки на объекты (эти самые obj, numbers, text) — это, блядь, как записки в кармане у Герасима. На самой бумажке написано не "собака", а "адрес сарая, где лежит Муму". Сама записка — в стеке (в кармане), а живая собака — в куче (в сарае)!
  • А сама куча — она общая для всех потоков, там бардак может быть. И за порядком там следит сборщик мусора (Garbage Collector, GC). Это такой дворник, который ходит и смотрит: если на объект в куче уже никто не ссылается (все записки-адреса выкинули), он такой — "А, свободен!" — и забирает этот хлам, освобождая память. Автоматически, блядь, без твоего "Муму-муму"!

Вот и вся магия. Не путай, где записка, а где сам объект, а то получишь NullPointerException — это как Герасим полез в карман, а записка-то потерялась, и он стоит, мычит: "Муму? Где Муму-то, блядь?". А её уже нет.