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

Из каких основных областей состоит память JVM и что где хранится?

JuniorJVM и сборка мусора
Ещё спрашивают так:
  • Что такое Metaspace?
Коротко

Куча (heap) — все объекты и массивы, общая для потоков, её чистит GC. Стек — у каждого потока свой: кадры вызовов с локальными переменными и ссылками. Metaspace — метаданные классов, в нативной памяти вне кучи.

  • Размеры: куча -Xms/-Xmx, стек -Xss, Metaspace -XX:MaxMetaspaceSize
  • Ещё вне кучи: кодовый кэш JIT, direct-буферы, стеки потоков, структуры GC
  • Ошибки: OutOfMemoryError: Java heap space / Metaspace, StackOverflowError

А ещё PermGen заменён Metaspace в Java 8

Попробуйте сами

GC: Eden, Survivor и продвижение

Подробно

Куча. Здесь живут все объекты, созданные через new, и массивы. Общая для всех потоков. Делится на поколения (молодое: Eden и Survivor; старое) или на регионы (G1, ZGC). Именно её обходит сборщик мусора.

Стек потока. Каждый вызов метода кладёт кадр: локальные переменные (примитивы — значением, объекты — ссылкой), аргументы, промежуточные значения. Метод вернулся — кадр снят, сборка мусора не нужна. Глубокая рекурсия переполняет стек — StackOverflowError.

Metaspace (Java 8+) — описания классов: поля, методы, байт-код, константный пул. Лежит в нативной памяти и по умолчанию растёт без ограничения. Утечка загрузчиков классов (передеплой в сервере приложений, динамически генерируемые классы) приводит к OutOfMemoryError: Metaspace. До Java 8 это была PermGen внутри кучи фиксированного размера.

Прочее вне кучи: кодовый кэш (скомпилированный JIT машинный код), direct ByteBuffer, структуры сборщика, стеки всех потоков. Поэтому процесс Java всегда занимает больше, чем -Xmx — важно в контейнерах.

Статические поля хранятся в объекте Class, то есть в куче, — частая путаница.

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

  • Назначение кучи, стека, Metaspace.
  • Что общее, а что своё у потока.
  • Какие ошибки бывают у каждой области.
  • Память процесса больше -Xmx.

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

  • Считать, что статические поля лежат в Metaspace.
  • Путать Metaspace и PermGen.

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

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

Показать варианты и ответ
  • ✓Куча — объекты, общая для потоков; стек — у каждого потока свой; Metaspace — метаданные классов
  • ✗Куча — объекты и метаданные классов; стек — общий для потоков; Metaspace — в куче
  • ✗StackOverflowError возникает при переполнении кучи
  • ✗Объекты хранятся в стеке потока, а куча — только для примитивов

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

  • Что такое поколения в куче?
  • Где живут статические поля?

Разбор темы

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

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

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

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

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