Из каких основных областей состоит память JVM и что где хранится?
- Что такое Metaspace?
Куча (heap) — все объекты и массивы, общая для потоков, её чистит GC. Стек — у каждого потока свой: кадры вызовов с локальными переменными и ссылками. Metaspace — метаданные классов, в нативной памяти вне кучи.
- Размеры: куча -Xms/-Xmx, стек -Xss, Metaspace -XX:MaxMetaspaceSize
- Ещё вне кучи: кодовый кэш JIT, direct-буферы, стеки потоков, структуры GC
- Ошибки: OutOfMemoryError: Java heap space / Metaspace, StackOverflowError
А ещё PermGen заменён Metaspace в Java 8
Подробно
Куча. Здесь живут все объекты, созданные через 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 возникает при переполнении кучи
- ✗Объекты хранятся в стеке потока, а куча — только для примитивов
Что спросят дальше
- Что такое поколения в куче?
- Где живут статические поля?
Разбор темы
- Память JVM и устройство объекта
Runtime data areas, стек против кучи, заголовок объекта и выравнивание, compressed oops и metaspace.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.