Что хранится в stack

Ответ

В стеке хранятся примитивные типы данных (int, boolean, char и т.д.) и ссылки на объекты. Также в стеке хранятся фреймы методов — локальные переменные и информация о вызовах методов. Каждый поток имеет свой стек.

Пример:

void foo() {
    int x = 5; // хранится в стеке
    String s = "Hello"; // ссылка на объект в стеке, сам объект — в куче
}

Стек работает по принципу LIFO (Last In, First Out). При вызове метода создается новый фрейм, при завершении — удаляется. Размер стека ограничен, переполнение вызывает StackOverflowError.

Ответ 18+ 🔞

А, ну вот смотри, как это всё работает, ёпта. Представь себе стопку тарелок на кухне — ту самую, куда мама всегда кричит не наваливать дохуя, а то всё разобьётся. Так вот стек в памяти — это почти то же самое, только вместо тарелок там твои примитивы да ссылки болтаются.

Вот смотри, когда ты пишешь какую-нибудь простую переменную, вроде int x = 5; — эта пятёрка тупо ложится в стек, как та самая тарелка. Никаких заморочек. А вот если ты создаёшь объект, типа String s = "Hello"; — тут уже интереснее. Сама ссылка s — она тоже в стеке, как записка с адресом. А вот само тело объекта, эта строка "Hello" — оно уже валяется в куче, в большой общей куче памяти, как мусор на свалке, прости господи. Ссылка просто на него указывает.

И главная фишка стека — принцип "последний зашёл, первый вышел", LIFO. Это как когда ты в баре заказываешь стопки: ту, которую поставили последней, ты и выпьешь первой. Каждый раз, когда ты вызываешь метод, на стек кладётся новый фрейм — такая пачка данных с локальными переменными этого метода и служебной инфой. Закончил метод — фрейм сняли, пошли дальше. У каждого потока свой собственный стек, чтобы они друг другу в тарелки не лезли.

Но есть одна огромная, блядь, проблема — размер стека не резиновый. Если ты начнёшь безбожно вызывать методы из методов, особенно рекурсивно, ты можешь этот стек так забить, что он просто лопнет. И тогда получишь классическую ошибку StackOverflowError — это и есть тот самый момент, когда ты навалил тарелок дохуя, и вся эта конструкция с грохотом летит на пол. Ядрёна вошь, как же это бесит, когда такое происходит из-за кривой рекурсии.

Вот, короче, и вся магия. Примитивы и ссылки — в стеке. Объекты — в куче. Работает по принципу стопки. Не перегружай — не будет тебе StackOverflowError. Всё просто, как три копейки.