Какие области данных времени выполнения существуют в JVM
Области данных времени выполнения (Run-Time Data Areas) — это участки памяти, которые JVM выделяет для хранения данных во время работы программы. Одни создаются при старте JVM и существуют до её остановки, другие привязаны к потокам и уничтожаются вместе с ними.
| Область | Общая / per-thread | Описание |
|---|---|---|
| PC Register | Per-thread | Адрес текущей выполняемой инструкции JVM |
| JVM Stack | Per-thread | Хранит фреймы вызовов методов |
| Native Method Stack | Per-thread | Стек для native-методов (написанных не на Java) |
| Heap | Общая | Память для всех экземпляров объектов и массивов |
| Method Area | Общая | Метаданные классов, пул констант, код методов |
| Run-Time Constant Pool | Общая (часть Method Area) | Константы и ссылки на методы/поля для каждого класса |
PC Register
Каждый поток JVM имеет собственный регистр PC (program counter), создаваемый при запуске потока. Он хранит адрес текущей выполняемой инструкции JVM. Если метод является native, содержимое PC Register не определено.
JVM Stack
Каждый поток имеет собственный стек, создаваемый одновременно с потоком. Стек хранит фреймы (frames) — по одному на каждый вызов метода. Стек может иметь фиксированный размер или динамически расширяться.
Heap
Куча — единственная область, общая для всех потоков. Здесь размещаются все экземпляры классов и массивы. Куча создаётся при запуске JVM и управляется сборщиком мусора. Объекты никогда не освобождаются явно. Память кучи не обязательно должна быть непрерывной.
Method Area
Область методов общая для всех потоков. Хранит структуры каждого класса: пул констант, данные полей и методов, код методов и конструкторов. Логически является частью кучи, но простые реализации могут не обрабатывать её сборщиком мусора.
Run-Time Constant Pool
Существует для каждого класса или интерфейса. Содержит числовые литералы (известные во время компиляции) и ссылки на методы и поля (разрешаемые во время выполнения). Создаётся JVM вместе с классом или интерфейсом и размещается в Method Area.
Native Method Stacks
Обычные стеки (стеки C) для поддержки native-методов, написанных на языке, отличном от Java.
На собеседовании: интервьюер ожидает, что вы разделите области на per-thread (PC Register, JVM Stack, Native Method Stack) и общие (Heap, Method Area). Частая ошибка — забыть про Run-Time Constant Pool или перепутать Stack и Heap. Помните: объекты живут в Heap, локальные переменные и вызовы методов — в Stack.