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

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

Ответ

Примитивы хранятся непосредственно в стеке (Stack Memory) как часть фрейма метода. Объекты создаются в куче (Heap Memory), а в стеке хранится только ссылка на этот объект.

Пример и различия:

public class StorageExample {
    public static void main(String[] args) {
        int count = 10;           // Примитив 'count' и его значение 10 — в стеке.
        String text = "Hello";    // Ссылка 'text' — в стеке, объект String "Hello" — в куче.
        Object obj = new Object(); // Ссылка 'obj' — в стеке, сам Object — в куче.
    }
}

Практические следствия:

  1. Скорость доступа: доступ к примитивам в стеке быстрее, чем к объектам в куче.
  2. Передача в методы:
    • Примитивы передаются по значению (копируется само значение).
    • Объекты передаются по ссылке на значение (копируется ссылка, а не сам объект).
  3. Управление памятью: память стека очищается автоматически при выходе из метода, а память кучи очищается сборщиком мусора (Garbage Collector).