- Эта серия будет посвящена базовому пониманию Java. Всякий раз, когда я ловлю себя на том, что спрашиваю: “Как это работает?”. Я создам сообщение в блоге и размещу его здесь. Эта серия не будет в порядке, поэтому не стесняйтесь читать любой пост, который вы сочтете наиболее актуальным. Все мои ссылки на этот пост в блоге можно найти здесь
Что такое стек вызовов?
- Теперь мои рассуждения о том, что такое стек вызовов, на самом деле были рекурсией. Если вы попытаетесь изучить рекурсию, как я сейчас пытаюсь это сделать, вы в конечном итоге столкнетесь со словами
стек вызовов
. При рекурсии все предыдущие вызовы методов сохраняются внутри стека вызовов. С учетом сказанного мы можем вернуться к рассматриваемому вопросу. Что такое стек вызовов? Ну, это то, что программа использует для отслеживания вызовов своих методов и состоит изстековых фреймов
, один кадр стека для каждого вызова метода. Поэтому, когда мы вызываем метод, он добавляется в стек вызовов. Также обратите внимание наstack
частьстека вызовов
. Это говорит нам о том, что стек вызовов работает на основе основных принципов стека `first-in-last-out’ . Вот почему вы часто будете читать терминологию выталкивания и нажатия в стек вызовов.
Что хранится в стеке фреймов?
Как я упоминал ранее, стек вызовов фактически состоит из фреймов стека, по одному для каждого вызова метода. Но что на самом деле содержат эти стековые фреймы? Ну, в основном они состоят из 4 вещей:
1) Локальные переменные (переменные внутри методов)
2) Аргументы, переданные в метод
3) Информация о фрейме стека вызывающего абонента
4) Обратный адрес. Обычно это находится где-то в середине кода вызывающего абонента
Каждый вызов метода создает свой собственный фрейм стека, который занимает место в стеке вызовов. Это становится особенно важным при работе с рекурсией, которая имеет дело исключительно с повторяющимися вызовами методов. Если у вас слишком много кадров стека, добавленных в стек вызовов, вы получите
переполнение стека
, что является распространенной логической ошибкой при рекурсии.
- Теперь я надеюсь, что мы оба сможем использовать эту информацию для решения проблемы рекурсии.
- Спасибо, что нашли время в свой рабочий день, чтобы прочитать этот мой пост в блоге. Если у вас есть какие-либо вопросы или проблемы, пожалуйста, прокомментируйте ниже или свяжитесь со мной по адресу Твиттер .
- Также обязательно загляните на мой канал YouTube для получения дополнительных руководств по программированию.
Оригинал: “https://dev.to/theplebdev/java-quickies-the-call-stack-3g4g”