Gymterview
middle

Какие области данных времени выполнения существуют в 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.