Где хранятся примитивные типы данных в памяти JVM?

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

Ответ

Место хранения зависит от контекста объявления переменной:

  1. В стеке потока (Stack Memory):

    • Хранятся локальные переменные примитивных типов, объявленные внутри методов или блоков кода.
    • Это включает параметры методов.
    • Память выделяется при входе в метод и освобождается при его завершении.

    Пример:

    public void calculate() {
        int localInt = 42;          // Хранится в стеке
        double localDouble = 3.14;  // Хранится в стеке
    }
  2. В куче (Heap Memory):

    • Примитивные типы, которые являются полями объекта, хранятся внутри этого объекта в куче.
    • Примитивы внутри массивов (например, int[]) также хранятся в куче.

    Пример:

    public class MyClass {
        private int instanceField = 10; // Хранится в куче как часть объекта MyClass
    }
    int[] primitiveArray = new int[5]; // Сам массив и его элементы (int) хранятся в куче

Ключевое отличие от ссылочных типов: Значение примитива хранится непосредственно в переменной (в стеке или внутри объекта в куче). Для ссылочного типа в переменной хранится только адрес (ссылка) на объект в куче.