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

Что верно про стек и кучу в JVM?

MiddleJVM и сборка мусора
Ещё спрашивают так:
  • Где хранятся локальные переменные-примитивы и сами объекты?
Коротко

Стек — у каждого потока свой (-Xss): кадры вызовов, локальные примитивы значением и ссылки. Куча — общая (-Xmx): сами объекты. Переполнение стека — StackOverflowError, нехватка кучи — OutOfMemoryError.

  • Тысячи платформенных потоков — тысячи стеков вне кучи
  • Escape analysis может разместить объект «на стеке» (скаляризовать), но это оптимизация JIT
  • Поля объекта, даже примитивные, лежат в куче вместе с ним

А ещё Виртуальные потоки хранят стек в куче, поэтому их можно миллионы

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

Подробно

Из того, что стек принадлежит потоку, следует важное практическое соображение: тысячи потоков означают тысячи стеков, и память под них не входит в кучу — при большом числе платформенных потоков процесс растёт, хотя -Xmx не превышен. Именно эту стоимость и снимают виртуальные потоки, храня продолжение в куче. StackOverflowError чаще всего означает бесконечную рекурсию, и увеличивать -Xss ради него обычно неправильно. Стоит помнить и о том, что не всё в куче: Metaspace с метаданными классов и direct-буферы живут за её пределами, поэтому рост памяти процесса при спокойной куче — типичный сценарий утечки вне кучи.

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

  • Что где хранится.
  • Свой стек у потока против общей кучи.
  • Ошибки переполнения.

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

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

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

Несколько верных вариантов. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Стек свой у каждого потока и хранит кадры вызовов с локальными переменными; куча общая для всех потоков
  • ✓Переполнение стека даёт StackOverflowError, нехватка кучи — OutOfMemoryError
  • ✓Локальная переменная-ссылка лежит в стеке, а сам объект — в куче
  • ✗Размер стека задаётся параметром -Xmx

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

  • Что ещё расположено вне кучи?
  • Почему виртуальные потоки дешевле платформенных по памяти?
  • Что происходит со ссылкой при выходе из метода?
  • Что такое escape analysis?

Разбор темы

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

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

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

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

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