Функции и переменные хранятся в стеке, а ссылки на строки и объекты хранятся в куче. Почему есть разница в том, как они хранятся?
Функции звонки хранятся в стеке ...
Обратите внимание, что реализация JVM может свободно хранить объекты в стеке или локальные переменные в куче - и современные JVM будут делать это в некоторых случаях. Стек и куча - это детали реализации. Понятия в языке Java - это область действия, время жизни и достижимость.
Я бы сказал, что «кадры стека для вызовов методов хранятся в стеке», но как только вы назовете их «кадрами стека», это становится тавтологией.
Я не уверен, что хочу использовать дупхаммер по этому вопросу, но если не точный дубликат, то он, по крайней мере, тесно связан с вопросом Что и где стопка и куча? Связанное чтение в блоге Эрика Липперта: Стек - это деталь реализации.




Некоторые из приведенных выше комментариев содержат ссылки на разницу. Стек временный. Фрагменты стека используются в качестве гнезд кода. Представьте себе большой кусок памяти, в котором вы отслеживаете только самую верхнюю часть памяти. Когда вы вызываете метод, система знает, сколько памяти требуется, чтобы запомнить, куда вернуться после выхода из метода, и достаточно места для переменных, необходимых для метода. Затем указатель стека указывает выше в памяти, предоставляя вам все пространство, которое он только что пропустил. Когда ваш метод возвращается, указатель стека возвращается туда, где он был до вызова вашего метода. Все переменные, которые были там, теперь исчезли.
Это не совсем так просто в таком сложном мире, как Java, но я все еще думаю о стеке на языке ассемблера, где я впервые столкнулся с ним. (Я стар.) Достаточно близко для этого обсуждения.
Куча разная. Куча - это управляемая память со сложной структурой, которая отслеживает используемую вами память. Если вы скажете new Foo (), Java знает, насколько велик Foo, и запрашивает у кучи достаточно места для его хранения. С этим случаются гораздо более сложные вещи. Но когда ваш метод возвращается, этот объект все еще существует. Если бы он был размещен в стеке, возникли бы настоящие проблемы, потому что стек раскручивается, когда ваш метод возвращается. Но ваша память в куче по-прежнему выделена, и ваш объект может продолжать существовать.
Опять же, это не так просто, но, возможно, в этом есть смысл.
Пространство в стеке существует только до тех пор, пока работает ваш метод. (Я предполагаю, что если вы вложитесь внутрь {}, это может занять больше места. Я не знаю.) Пространство в куче сохраняется до тех пор, пока объекты не будут освобождены, но это может быть намного дольше, чем продолжительность вызова метода.
Функции хранятся в стеке?