Где размещаются объекты, создаваемые оператором new?
- Чем стек отличается от кучи в Java?
- Где хранятся локальные переменные?
- Какие области памяти есть у JVM?
Объекты — в куче, общей для всех потоков; в стеке потока — кадры вызовов с локальными переменными, в том числе ссылками на объекты.
- Стек свой у каждого потока, очищается при выходе из метода
- Кучу чистит сборщик мусора; метаданные классов — в Metaspace вне кучи
А ещё Escape analysis может не создавать в куче объект, не покидающий метод, — но это оптимизация, а не правило
Подробно
Основные области памяти JVM:
- куча (heap) — общая для всех потоков. Здесь живут все объекты, созданные через
new, и массивы. Освобождает её сборщик мусора. Размер задаётся-Xms/-Xmx; нехватка —OutOfMemoryError: Java heap space; - стек потока — у каждого потока свой. При вызове метода создаётся кадр (frame) с локальными переменными, параметрами и промежуточными значениями; при выходе он снимается. Примитивные локальные переменные лежат прямо в кадре, для объектов — только ссылка. Глубокая или бесконечная рекурсия даёт
StackOverflowError; - Metaspace — метаданные загруженных классов, вне кучи (раньше — PermGen);
- кэш скомпилированного кода и другие служебные области.
Почему это важно: объект в куче доступен нескольким потокам, если они получили ссылку, — отсюда проблемы конкурентного доступа. Локальные переменные в стеке видны только своему потоку.
Оптимизация escape analysis: если JIT видит, что объект не покидает метод, он может разложить его на поля в регистрах и не выделять в куче. Рассчитывать на это при проектировании нельзя.
Что хотят услышать
- Объекты в куче, ссылки и примитивы-локальные — в стеке.
- Стек у каждого потока свой, куча общая.
- Кто очищает каждую область, ошибки OOM и StackOverflow.
- Metaspace — плюс.
Частые ошибки
- Считать, что объект хранится в стеке, раз переменная локальная.
- Думать, что параметр -Xmx ограничивает всю память процесса.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗В стеке потока, вместе с локальными переменными
- ✗В области хранения метаданных классов
- ✓В куче, которую очищает сборщик мусора
- ✗В регистрах процессора
Что спросят дальше
- Что произойдёт при переполнении стека и при нехватке кучи?
- Что ещё располагается вне кучи?
Разбор темы
- Память JVM и устройство объекта
Runtime data areas, стек против кучи, заголовок объекта и выравнивание, compressed oops и metaspace.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.