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

«Где в памяти (Java) хранятся объекты и примитивные переменные?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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)
    }
}