Что такое куча (heap) в Java?

Ответ

Куча (Heap) — это область динамической памяти в JVM, предназначенная для хранения всех объектов и массивов, создаваемых во время выполнения программы. Управление памятью в куче осуществляется автоматически сборщиком мусора (Garbage Collector, GC).

Ключевые характеристики:

  • Общая для всех потоков приложения.
  • Разделена на поколения (generations) для оптимизации работы GC:
    • Young Generation (Eden + Survivor spaces) — для новых объектов.
    • Old (Tenured) Generation — для долгоживущих объектов.
    • Metaspace (ранее Permanent Generation) — для метаданных классов.
  • Размер кучи задается JVM-параметрами:
    • -Xms — начальный размер.
    • -Xmx — максимальный размер.

Пример создания объекта в куче:

// Объект 'obj' создается и размещается в куче
Object obj = new Object();

Когда ссылка obj перестает быть достижимой, GC может освободить занимаемую объектом память.

Ответ 18+ 🔞

А, слушай, смотри, куча! Нет, не та, куда мусор кидают, а та, где у тебя в Java все объекты болтаются, как носки после стирки. Это типа общага для всех твоих new Object(), понимаешь? Все твои массивы, все твои инстансы — они тут, в этой самой хипе, живут-поживают.

И главная фишка в том, что тут уборщица — не тётя Глаша из ЖЭКа, которая раз в квартал приходит, а сборщик мусора (Garbage Collector, или просто GC). Он крутой, он автоматический, он сам смотрит, кто тут уже не нужен, и выносит их на мороз, освобождая место. Ёпта, красота же!

А чтобы ему, этому GC, было проще, куча-то поделена на районы, как город. Есть Young Generation — это типа спальный район для юных и неоперившихся объектов. Там ещё внутри своя движуха: Eden (где все рождаются), Survivor spaces (куда переезжают те, кто выжил после первой уборки). А если объект оказался крепким орешком и пережил несколько таких чисток, его переводят в Old Generation — это уже элитный район для долгожителей, почётных пенсионеров. Ну и Metaspace — это типа архив, где хранятся все чертежи (метаданные классов), а не сами объекты. Раньше это называлось Permanent Generation, но её, блядь, переименовали, потому что она не такая уж и permanent на самом деле.

Размеры этой всей коммуналки ты сам можешь задать, не будь лохом. Параметры JVM:

  • -Xms — это стартовый размер, с чего всё начинается. Поставишь мало — будешь постоянно расширяться, тормоза.
  • -Xmx — это потолок, больше которого не вырастешь, хоть тресни. Упираешься в него — получаешь OutOfMemoryError, и всё, пиздец, приехали.

Ну и классический пример, который даже дурак поймёт:

// Вот этот самый 'new Object()' — он как раз в куче и возникает, как чёрт из табакерки
Object obj = new Object();

Пока на этот obj кто-то смотрит (есть на него ссылка), GC его не тронет. Но как только все на него забудут, ссылки потеряются — всё, объект становится мусором. И рано или поздно наш уборщик GC его приберёт, освободит память. Волшебство, ёбана! Самому ничего делать не надо. Главное — не наделать таких ссылок, которые он не сможет найти и почистить, а то будет memory leak, и тогда твоё приложение сожрёт всю память и накроется медным тазом.