Ответ
В 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)
}
}