Переменные стека JVM - PullRequest
       6

Переменные стека JVM

4 голосов
/ 26 марта 2011

Я понимаю, что JVM создает стек для каждого потока, и этот стек содержит вызовы других методов, когда поток их вызывает. Я не понимаю, когда в стеке также будут указаны локальные переменные и частичные результаты. Я думал, что глобальные и локальные переменные (примитивы и ссылки) будут существовать в куче, а не в стеке. Кто-нибудь может уточнить, что это значит? Во-вторых, он говорит о частичных результатах, означает ли это, что когда переключение потоков происходит, эти наполовину выполненные результаты (копии) из локальных переменных и переменных экземпляра?

Спасибо

-Abidi

Ответы [ 2 ]

5 голосов
/ 27 марта 2011

У каждой JVM есть стек времени выполнения фреймов вызова метода.Каждый кадр метода содержит

  • Ссылка на класс Java, содержащий этот метод.
  • Стек операнда для хранения временных значений.
  • Массив "локальных переменных" длясодержит аргументы функции и временные результаты.

Этот массив локальных переменных существует для того, чтобы при первом вызове функции аргументы этой функции могли где-то сохраняться.Массив локальных переменных фактически не содержит все локальные переменные, объявленные в исходном коде Java;скорее это скорее временный буфер для хранения ссылок на объекты Java, объявленные где-либо в куче, или для хранения значений, на которые ссылаются достаточно много раз, чтобы поместить их в стек времени выполнения было бы медленным или неэффективным.

Короче, вы правы, что локальные и глобальные хранятся в куче.Массив «локальных переменных» в потоках Java не соответствует этим локальным объектам, а скорее очищает пространство, используемое потоком при интерпретации байт-кода для метода.

0 голосов
/ 14 мая 2013

У каждой JVM есть стек времени выполнения фреймов вызова метода.Каждый фрейм метода содержит

A reference to the Java class containing that method.
An operand stack for holding temporary values.
A "local variables" array for holding function arguments and temporary results.

Этот массив локальных переменных существует, так что при первом вызове функции аргументы этой функции могут где-то храниться.Массив локальных переменных фактически не содержит все локальные переменные, объявленные в исходном коде Java;скорее это скорее временный буфер для хранения ссылок на объекты Java, объявленные в других местах кучи, или для хранения значений, на которые ссылаются достаточно много раз, чтобы поместить их в стек времени выполнения было бы медленным или неэффективным., вы правы, что локальные и глобальные хранятся в куче.Массив «локальных переменных» в потоках Java не соответствует этим локальным объектам, а скорее очищает пространство, используемое потоком при интерпретации байт-кода для метода.

...