Опишите своими словами стек вызовов метода. Когда метод помещается в стек вызовов? Когда из него извлекается метод? В Java какой метод всегда помещается в стек первым?
Ivan Zelenkov
28 уровень
Вопрос про Стэк
Обсуждается
Комментарии (7)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Wladyslaw Java Developer Master
12 ноября 2020, 23:33полезный
Стек есть стек - структура типа LIFO. При вызове метода - создаётся фрейм этого метода и пушиться на верх стека. При завершении выполнения фрейм с верха стека убирается. Фрейм наверху стека - это текущий фрейм.
Фреймы внутри содержат локальные переменные, параметры метода. Если метод не статический - ещё фрейм хранит неявный параметр this. Там ещё какая-то структура есть для хранения промежуточных результатов вычислений. Вроде как, тоже стек - стек операндов. Плюс фрейм должен хранить инфу типа адресов возврата и прочей служебной инфы, которая понадобится после завершения выполнения метода. Например - состояние pc-регистра на момент вызова метода из метода который находится ниже по стеку, чтобы знать какую инструкцию выполнять следующей. Если возвращается значение - нужно запушить это значение в стек операндов предыдущего фрейма. Плюс нужна инфа об исключениях и их обработчиках типа где начинается трай, какой код вызвать для какого исключения. Если не найден обработчик - то восстанавливается предыдущий фрейм и исключение перебрасывается уже в его контексте.
Стек у каждого треда выполнения свой, потому для данных которые хранятся на стекле о потокобезопасности можно не волноваться.
Это в добавку к тому ч отписано ниже, ближе к тому как в jvm оно происходит. Но, лучше погуглить, потому что я тоже могу где-то напутать что-то. Многие детали также могут зависеть от конкретной реализации виртуальной машины, многие вещи в них могут по разному работать.
+3
Ivan Zelenkov
12 ноября 2020, 23:43
спасибо. самый первый метод, который помещается в стек это main?
0
hidden #2322530
13 ноября 2020, 08:49
да
+1
Ivan Zelenkov
13 ноября 2020, 17:14
спасибо
0
ГоффMaster
14 ноября 2020, 21:08
И от меня спасибо)
0
ГоффMaster
12 ноября 2020, 22:56полезный
Я попробую очень грубо и абстрактно, без джавы, просто на пальцах.
Вот у тебя работает программа, она выполняется пошагово. В программе на каком-то шаге вызывается какой-то метод и выполнение программы уходит в этот метод. Метод отрабатывается и по команде ретурн выполнение программы должно вернутся туда, откуда метод вызывали. Сам метод ведь не знает, откуда его вызвали, ведь его можно вызвать из любой точки программы. Поэтому при вызове метода в стек заносится то место, откуда метод вызывают, туда произойдёт возврат и с этого места продолжится выполнение программы.
Предположим, что метод в свою очередь вызывает ещё другой метод. Тогда в стек тоже заносится место, откуда вызвали этот метод. Там теперь две записи - откуда вызвали первый метод, и откуда первый метод вызвал второй. Стек устроен так, что из него сначала считывается последний занесённый туда элемент. По команде ретурн процессор считывает из стека место, на которое надо вернуться - и это будет то место, откуда вызвали именно этот метод, а не вышестоящий.
+2
Ivan Zelenkov
12 ноября 2020, 23:10
Спасибо
0