Где в памяти (Java) хранятся объекты и примитивные переменные?

Ответ

В JVM память разделена на несколько областей. Хранение зависит от типа переменной.

Тип данных Где хранится Пояснение
Локальные примитивные переменные ( int x = 5; ) Стек (Stack Memory) Быстрая память для вызовов методов. Удаляется при выходе из метода.
Локальные ссылки на объекты ( MyClass obj; ) Стек (Stack Memory) В стеке хранится только ссылка (адрес объекта).
Сам объект ( new MyClass() ) Куча (Heap Memory) Основная область динамической памяти. Управляется Garbage Collector (GC).
Статические переменные ( static int count; ) Metaspace (ранее PermGen) Область для метаданных классов и статических переменных.
Строковые литералы ( "text" ) String Pool (внутри кучи) Специальная область кучи для уникальных строковых литералов.

Пример:

public class MemoryExample {
    private static int staticVar = 10; // Metaspace
    private int instanceVar = 20;      // Куча (в составе объекта)

    public void method() {
        int localPrimitive = 30;       // Стек
        String localRef = "Hello";    // Стек (ссылка), "Hello" в String Pool
        Object obj = new Object();     // Стек (ссылка), Куча (объект Object)
    }
}

Ответ 18+ 🔞

А, слушай, вот эта вся хуйня с памятью в JVM — это вообще отдельная песня, блядь. Ну, представь себе, что у тебя в голове не одна полка, а целая система хранения, как на складе у какого-нибудь хитрожопого логиста.

Вот смотри, есть у тебя, например, локальная переменная, примитивная такая, int x = 5;. Куда её? Правильно, на стек (Stack Memory), быстренько, под руку. Метод вызвался — переменная появилась, метод закончился — её и след простыл, как будто и не было. Удобно, чё.

А вот если ты объявляешь ссылку, типа MyClass obj; — это что? Это же не сам объект, ёпта! Это просто бумажка с адресом, где этот объект лежит. И эта бумажка-ссылка — тоже на стеке, в кармане у метода. А где же сам объект, этот new MyClass()? А его, сука, уже отправили на кучу (Heap Memory). Это как общага большая, неразбериха, мусор везде, и за порядком там следит специальный уборщик — Garbage Collector (GC). Он ходит, смотрит, кому ещё жить, а кого уже в утиль.

А статические переменные, static int count; — это вообще особая каста, блядь. Они не в общаге, они в каком-то своём закрытом клубе, в Metaspace (раньше это PermGen назывался, но там свои приколы были). Там метаданные классов да статика живут, почти как вечность.

И строки! Строковые литералы, "text" — это вообще отдельная история, в рот меня чих-пых! Их складывают в специальный бассейн, String Pool, который внутри кучи плавает. Чтобы одинаковые строки не копировались, как дурацкие, а ссылались все на одну.

Вот, смотри на пример, тут всё как на ладони:

public class MemoryExample {
    private static int staticVar = 10; // Metaspace — в своём клубе для избранных
    private int instanceVar = 20;      // Куча — в общаге, внутри объекта

    public void method() {
        int localPrimitive = 30;       // Стек — быстренько и мимо кассы
        String localRef = "Hello";    // Стек (ссылка), а само "Hello" — в том самом бассейне
        Object obj = new Object();     // Стек (ссылка), а объект — в общагу, на съедение GC
    }
}

Вот и вся магия, блядь. Главное — не запутаться, где что лежит, а то можно такого наотлаживать, что потом самому себе волосы на жопе рвать.