Сначала ответь вслух
Скажи ответ вслух хотя бы пару минут, потом открой эталон и сравни. Эталон открыт всем и не требует входа.
Показать ответ
Эталонный ответ
У каждого потока свой стек. На каждый вызов метода в нём появляется кадр: локальные переменные, параметры, промежуточные значения. В локальной переменной лежит примитив или ссылка, но не сам объект.
Объекты и массивы создаются в куче, она общая для всех потоков, её чистит сборщик мусора. В HotSpot статические поля тоже в куче, в объекте Class, а описания классов и методов — в Metaspace, который с Java 8 заменил PermGen.
void handle() {
int attempts = 3; // в кадре стека
Order order = new Order("A-1"); // ссылка в стеке, объект в куче
}Переполнение стека — StackOverflowError, чаще всего от глубокой рекурсии. Нехватка кучи — OutOfMemoryError: Java heap space, нехватка Metaspace — OutOfMemoryError: Metaspace.
Как у тебя получилось?
Уточняющие вопросы
Так обычно копают глубже. Раскрой строку, когда ответишь вслух.
Уточнение 1-го уровня: Правда ли, что все объекты создаются в куче?
Ответ уровня Senior
По спецификации да. Но JIT по анализу локальности может вовсе убрать выделение и разложить объект на локальные переменные, если ссылка не уходит из метода.
Типичные ошибки
- Говорить, что примитивы всегда в стеке: поле int объекта лежит в куче вместе с объектом.
- Путать Metaspace с кучей.
Первоисточники
Быстрые задания по теме
Для темы «Области памяти JVM» быстрых заданий пока нет
Можно проверить всю зону «JVM и память» тестом на 10 минут.
Проверить себя за 10 минут