← Назад к вопросам

Как стек очищается

2.0 Middle🔥 131 комментариев
#JVM и управление памятью

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как стек очищается в Java

Это фундаментальный вопрос о памяти Java. Рассскажу о жизненном цикле стека (Stack), его очистке и связи с кучей (Heap).

Основные концепции

Stack vs Heap:

ХарактеристикаStackHeap
СтруктураLIFO (Last In First Out)Свободный граф объектов
ПамятьАвтоматическое удалениеУправление Garbage Collector
СкоростьОчень быстроМедленнее
РазмерОграничен (обычно 1-8 MB)Большой размер
ПотокобезопасностьКаждый поток свой стекОбщая для всех потоков
ДанныеПримитивы + ссылки на объектыСами объекты

Жизненный цикл Stack

1. Создание и управление Stack

public class StackExample {
    public static void main(String[] args) {
        int age = 25;           // int переменная на стеке
        String name = "John";   // ссылка на стеке
        Person person = new Person();
    }
}

Очистка Stack: Вызов и возврат из методов

Механизм LIFO (Last In First Out)

public class StackUnwinding {
    public static void main(String[] args) {
        int result = methodA();
    }

    static int methodA() {
        int x = 10;
        int y = methodB();
        return x + y;
    }

    static int methodB() {
        int z = 5;
        return z;
    }
}

Пошаговая очистка:

Шаг 1: main() вызвана
Stack: [main]

Шаг 2: main() вызывает methodA()
Stack: [main, methodA]

Шаг 3: methodA() вызывает methodB()
Stack: [main, methodA, methodB]

Шаг 4: methodB() возвращает 5
Stack: [main, methodA]  ← методB удалена!

Шаг 5: methodA() возвращает 15
Stack: [main]  ← методA удалена!

Очистка локальных переменных

После выхода из блока

public void exampleScope() {
    int a = 5;
    
    {
        int b = 10;
        String str = "hello";
    }  // b и str удаляются отсюда!
}

StackOverflowError: Переполнение Stack

public int badRecursion(int n) {
    return badRecursion(n + 1);  // Бесконечный вызов!
}

Правильная рекурсия:

public int factorial(int n) {
    if (n <= 1) return 1;
    return n * factorial(n - 1);
}

Ключевые выводы

Stack очищается:

  1. ✓ Автоматически при выходе из метода
  2. ✓ В обратном порядке (LIFO)
  3. ✓ Примитивы и ссылки удаляются сразу
  4. ✓ Переполнение вызывает StackOverflowError

Heap очищается:

  1. ✓ Garbage Collector удаляет недостижимые объекты
  2. ✓ Сложнее отследить
  3. ✓ Может привести к memory leak'ам
Как стек очищается | PrepBro