Что верно про стек и кучу в JVM?
- Где хранятся локальные переменные-примитивы и сами объекты?
Стек — у каждого потока свой (-Xss): кадры вызовов, локальные примитивы значением и ссылки. Куча — общая (-Xmx): сами объекты. Переполнение стека — StackOverflowError, нехватка кучи — OutOfMemoryError.
- Тысячи платформенных потоков — тысячи стеков вне кучи
- Escape analysis может разместить объект «на стеке» (скаляризовать), но это оптимизация JIT
- Поля объекта, даже примитивные, лежат в куче вместе с ним
А ещё Виртуальные потоки хранят стек в куче, поэтому их можно миллионы
Подробно
Из того, что стек принадлежит потоку, следует важное практическое соображение: тысячи потоков означают тысячи стеков, и память под них не входит в кучу — при большом числе платформенных потоков процесс растёт, хотя -Xmx не превышен. Именно эту стоимость и снимают виртуальные потоки, храня продолжение в куче. StackOverflowError чаще всего означает бесконечную рекурсию, и увеличивать -Xss ради него обычно неправильно. Стоит помнить и о том, что не всё в куче: Metaspace с метаданными классов и direct-буферы живут за её пределами, поэтому рост памяти процесса при спокойной куче — типичный сценарий утечки вне кучи.
Что хотят услышать
- Что где хранится.
- Свой стек у потока против общей кучи.
- Ошибки переполнения.
Частые ошибки
- Считать, что -Xmx ограничивает всю память процесса.
- Лечить StackOverflowError увеличением размера стека вместо исправления рекурсии.
Проверьте себя
Несколько верных вариантов. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Размер стека потока задаётся параметром -Xmx, а размер кучи — параметром -Xss
- ✓Стек у каждого потока свой, а куча общая для всех
- ✓Переполнение стека — StackOverflowError, нехватка кучи — OutOfMemoryError
- ✓Ссылка-переменная лежит в стеке, а сам объект — в куче
Что спросят дальше
- Что ещё расположено вне кучи?
- Почему виртуальные потоки дешевле платформенных по памяти?
- Что происходит со ссылкой при выходе из метода?
- Что такое escape analysis?
Разбор темы
- Память JVM и устройство объекта
Runtime data areas, стек против кучи, заголовок объекта и выравнивание, compressed oops и metaspace.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.