Получить доступ

Где размещаются объекты, создаваемые оператором new?

JuniorJVM и сборка мусора
Ещё спрашивают так:
  • Чем стек отличается от кучи в Java?
  • Где хранятся локальные переменные?
  • Какие области памяти есть у JVM?
Коротко

Объекты — в куче, общей для всех потоков; в стеке потока — кадры вызовов с локальными переменными, в том числе ссылками на объекты.

  • Стек свой у каждого потока, очищается при выходе из метода
  • Кучу чистит сборщик мусора; метаданные классов — в Metaspace вне кучи

А ещё Escape analysis может не создавать в куче объект, не покидающий метод, — но это оптимизация, а не правило

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Основные области памяти JVM:

  • куча (heap) — общая для всех потоков. Здесь живут все объекты, созданные через new, и массивы. Освобождает её сборщик мусора. Размер задаётся -Xms/-Xmx; нехватка — OutOfMemoryError: Java heap space;
  • стек потока — у каждого потока свой. При вызове метода создаётся кадр (frame) с локальными переменными, параметрами и промежуточными значениями; при выходе он снимается. Примитивные локальные переменные лежат прямо в кадре, для объектов — только ссылка. Глубокая или бесконечная рекурсия даёт StackOverflowError;
  • Metaspace — метаданные загруженных классов, вне кучи (раньше — PermGen);
  • кэш скомпилированного кода и другие служебные области.

Почему это важно: объект в куче доступен нескольким потокам, если они получили ссылку, — отсюда проблемы конкурентного доступа. Локальные переменные в стеке видны только своему потоку.

Оптимизация escape analysis: если JIT видит, что объект не покидает метод, он может разложить его на поля в регистрах и не выделять в куче. Рассчитывать на это при проектировании нельзя.

Что хотят услышать

  • Объекты в куче, ссылки и примитивы-локальные — в стеке.
  • Стек у каждого потока свой, куча общая.
  • Кто очищает каждую область, ошибки OOM и StackOverflow.
  • Metaspace — плюс.

Частые ошибки

  • Считать, что объект хранится в стеке, раз переменная локальная.
  • Думать, что параметр -Xmx ограничивает всю память процесса.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓В куче — общей для всех потоков области, за очистку которой отвечает сборщик мусора
  • ✗В стеке потока, вместе с локальными переменными
  • ✗В области хранения метаданных классов
  • ✗В регистрах процессора

Что спросят дальше

  • Что произойдёт при переполнении стека и при нехватке кучи?
  • Что ещё располагается вне кучи?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем