Что такое Frame в JVM
Frame (фрейм) — это структура данных, создаваемая при каждом вызове метода и уничтожаемая при завершении вызова. Фрейм выделяется из стека потока и хранит локальные переменные, стек операндов и ссылку на пул констант текущего класса.
Состав фрейма
- Массив локальных переменных — хранит параметры метода и локальные переменные. Индексация начинается с нуля. Для метода экземпляра локальная переменная 0 всегда содержит
this - Стек операндов (Operand Stack) — LIFO-стек для промежуточных вычислений. Инструкции JVM берут операнды из стека и помещают результат обратно
- Ссылка на Run-Time Constant Pool — для динамического связывания
Текущий фрейм
В любой момент для данного потока активен только один фрейм — текущий (current frame). Его метод является текущим методом. Когда метод вызывает другой метод, создаётся новый фрейм, который становится текущим. При возврате метода текущий фрейм отбрасывается, а предыдущий снова становится текущим.
Динамическое связывание (Dynamic Linking)
Каждый фрейм содержит ссылку на Run-Time Constant Pool для поддержки динамического связывания. Символические ссылки из class-файла преобразуются в конкретные ссылки на методы при первом обращении. Позднее связывание позволяет изменять другие классы без нарушения работы текущего кода.
Завершение вызова метода
Нормальное завершение: метод выполняет инструкцию возврата, значение (если есть) помещается в стек операндов вызывающего фрейма.
Резкое завершение (abrupt completion): при возникновении необработанного исключения фрейм отбрасывается без возвращения значения.
На собеседовании: достаточно знать три компонента фрейма (локальные переменные, стек операндов, ссылка на Constant Pool) и то, что фрейм создаётся при каждом вызове метода. Если спрашивают о размере стека или StackOverflowError — объясните, что каждый вызов метода создаёт новый фрейм, и при глубокой рекурсии стек переполняется.