Возможно, вам будет полезно подумать о том, как может выглядеть ваш скомпилированный код на уровне машины (или, лучше для нас, людей). Рассмотрим это как возможный пример в сборке X86:
При вызове метода аргументы передаются либо в регистры, либо передаются в самом стеке. В любом случае, код вызова метода в конечном итоге:
call the_method
Когда это произойдет, текущий указатель команд помещается в стек. Указатель стека указывает на него. Теперь мы находимся в функции:
the_method:
push ebp
mov ebp, esp
Текущий указатель базы сохраняется в стеке и базовый указатель затем используется для ссылки на вещи в стеке (как принятый в переменных).
sub esp, 8
Далее, 8 байтов (при условии выделения двух четырехбайтовых целых чисел) выделяются в стеке.
mov [ebp-4], 4
mov [ebp-8], 2
Локальные переменные назначаются.Это можно было бы сделать, просто нажав их, но, скорее всего, будет задействован sub
. Быстрая перемотка вперед до конца:
mov esp, ebp
pop ebp
ret
Когда это происходит, указатель стеки находится прямо туда, где он был, когда мы начинали, указывая на хранимый указатель базы (сохраненный указатель кадра). Это возвращается в EBP, оставляя ESP, указывая на указатель возврата, который затем «выталкивается» в EIP с помощью ret
. Фактически, стек разматывается. Несмотря на то, что фактические места памяти не изменились для двух локальных переменных, они эффективно выше стека (физически ниже в памяти, но я думаю, что вы понимаете, что я имею в виду.)
https://docs.oracle.com /javase/specs/jvms/se8/html/jvms-2.html#jvms-2.6 – fabian
Когда метод заканчивается, этот блок памяти стека, зарезервированный для этого метода, становится пустым, потому что больше не требуется (функция завершена) и указатель стека возвращается к предыдущему блоку стека (для продолжения предыдущей функции, с которой вы имели дело). –
Ознакомьтесь с этой 17-летней статьей о том, как виртуальная машина Java обрабатывает вызов и возврат метода] (http://www.javaworld.com/article/2076949/learn-java/how-the-java-virtual-machine- ручки-метод-вызов-и-return.html). В нем подробно объясняется, что происходит при вызове и возврате метода. Основы JVM не должны сильно меняться в течение всего времени. Вы можете перекрестно проверить с помощью указанной выше спецификации, если у вас есть время ... – MicSim