Вопрос проверяет понимание модели памяти JVM и различий между значениями и ссылками.
Примитивы обычно хранятся в стеке или внутри объектов.
Объекты-обёртки всегда размещаются в heap.
Ссылки на объекты хранятся в стеке или в других объектах.
Место хранения зависит от контекста использования.
Garbage Collector работает только с объектами в heap.
Для корректного понимания важно рассматривать память JVM целиком.
JVM использует несколько ключевых областей:
Stack
Heap
Metaspace
В этом вопросе нас интересуют первые две.
Примитивы могут храниться:
В stack, если это локальные переменные
В heap, если они являются полями объекта
Пример:
class A {
int x; // хранится в heap как часть объекта
}
void method() {
int y = 10; // хранится в stack
}
Объекты-обёртки (Integer, Long, Boolean и т.д.):
Всегда создаются в heap
В стеке хранится только ссылка на объект
Даже если значение маленькое и взято из кэша, сам объект всё равно находится в heap.
GC:
Отслеживает достижимость объектов в heap
Не работает со stack напрямую
Удаляет только объекты, на которые нет ссылок
Примитивы — это значения, объекты-обёртки — это сущности в heap, и понимание этого напрямую влияет на производительность и корректность кода.