Gymterview
middle

Что такое 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 — объясните, что каждый вызов метода создаёт новый фрейм, и при глубокой рекурсии стек переполняется.