Ответ
В 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
}
}
Вот и вся магия, блядь. Главное — не запутаться, где что лежит, а то можно такого наотлаживать, что потом самому себе волосы на жопе рвать.