Размер взят по кадру стека

Стек Java создает новый кадр для каждого вызова метода. Но занимает ли этот кадр память в стеке?

Чтобы уточнить мой вопрос:

public void oneWay()
{
  System.out.println("start");
  get1();
}

private void get1()
{
  System.out.println("get1");
  get2();
}

private void get2()
{
  System.out.println("get2");
}

Вывод это так же, как:

public void anotherWay()
{
  System.out.println("start");
  System.out.println("get1");
  System.out.println("get2");
}

Но занимает ли второй фрагмент больше памяти в стеке или равно? Короче говоря, фрейм стека занимает память?

РЕДАКТИРОВАТЬ: Сколько памяти занимает кадр стека? Есть ли какая-либо спецификация от Sun, теперь Oracle?

3 ответа

Решение

Как сказано в " Внутри виртуальной машины Java",

Кадр стека состоит из трех частей: локальные переменные, стек операндов и данные кадра. Размеры локальных переменных и стека операндов, которые измеряются словами, зависят от потребностей каждого отдельного метода. Эти размеры определяются во время компиляции и включаются в данные файла класса для каждого метода. Размер данных кадра зависит от реализации.

Когда виртуальная машина Java вызывает метод Java, она проверяет данные класса, чтобы определить количество слов, необходимых для метода, в локальных переменных и стеке операндов. Он создает кадр стека соответствующего размера для метода и помещает его в стек Java.

Да, естественно. Вот почему вы получаете переполнение стека, если вы вкладываете слишком глубоко. Вы можете использовать -Xss переключатель командной строки для изменения размера стека, если вы обнаружите, что вам нужен больший (или меньший) стек для ваших потоков.

Кажется, что спецификация предоставляет большую свободу для реализации, так что, в общем, вы не можете полагаться на размер кадра стека.

Вы можете посчитать количество кадров стека в стеке текущего потока как:

Thread.currentThread().getStackTrace().length

В вашем случае получение этого значения в get2 даст вам большее значение, чем получить его непосредственно в oneWay (больше на 2). Точные значения зависят от того, где в вашем коде вы звоните oneWay, Хотя некоторые другие языки программирования не обязательно создают стековый фрейм для каждого вызова функции, это всегда имеет место для Java. Спецификация JVM прямо заявляет в §2.6, что "новый кадр создается каждый раз, когда вызывается метод". и позже "Кадры выделяются из стека виртуальной машины Java". Таким образом, в Java каждый вызов метода устанавливает кадр стека, и каждый кадр стека занимает память в стеке. Даже при вызове функции, которая ничего не делает, виртуальной машине требуется определенный объем памяти для отслеживания самого кадра стека.

Другие вопросы по тегам