Вопрос с собеседования · Java

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

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

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

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

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

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования