Что хранится в стеке

Ответ

Стек хранит примитивные типы данных (int, boolean, char и т.д.) и ссылки на объекты. Также в стеке хранятся вызовы методов (стек вызовов) — кадры стека (stack frames) с локальными переменными метода, параметрами и адресом возврата.

Пример:

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

void bar(int y) {
    // y и другие локальные переменные — в стеке
}

Особенности:

  • Быстрый доступ, но ограниченный размер
  • Автоматическое управление памятью (освобождается при выходе из метода)
  • Потокобезопасен (у каждого потока свой стек)

Ответ 18+ 🔞

А, ну вот, опять про эту вашу память. Слушай, представь себе, что стек — это как твой рабочий стол, только дохуя маленький и аккуратный. Туда ты кладёшь всё, что нужно прямо сейчас и ненадолго: ручку, кружку, пачку сигарет. Это твои примитивы — int, boolean, эта вся мелочёвка. И записки с адресами, где лежат большие коробки — это ссылки на объекты в куче, которые на стол уже не влезают, ёпта.

И вот самое главное — стек вызовов. Это когда ты звонишь другу, чтобы спросить, где затусить, а он тебе говорит: «Погоди, я сейчас у другого спрошу». И пока он не вернётся с ответом, твой разговор висит в эфире, ждёт. Вот так и методы: foo() вызывает bar(), и пока bar() не отработает и не вернёт управление, кадр foo() с его переменными x и s тихо себе лежит в стеке, как запись в блокноте «спросить у Коляна про бар».

Пример, чтобы совсем понятно стало:

void foo() {
    int x = 5; // лежит в стеке, прямо на столе, как пятак
    String s = "Hello"; // а это — бумажка с адресом, где в куче (в гараже) лежит эта самая строка
    bar(x); // звоним Коляну, передаём ему пятак
}

void bar(int y) {
    // Колян получил твой пятак (значение скопировалось в его стек), всё честно
}

А теперь особенности, без которых нихуя не понять:

  • Быстрый доступ, но размер — овердохуища маленький. Это как быстрая память в процессоре — супершустрая, но её дохрена мало. Переполнил — всё, получи StackOverflowError, и привет, программа накрылась медным тазом.
  • Самоочистка. Вышел из метода — всё, что было в его кадре (локальные переменные), автоматом выкинулось. Никакого мусора руками собирать не надо, красота.
  • Потокобезопасен от рождения. У каждого потока — свой личный стек, свои личные «записки на столе». Один поток не полезет в записки другого, поэтому тут даже синхронизация не нужна, терпения ебать ноль на это тратить.