Ответ
Стек и куча — это две основные области памяти, управляемые JVM, с разным назначением и жизненным циклом.
| Сравнение: | Параметр | Стек (Stack Memory) | Куча (Heap Memory) |
|---|---|---|---|
| Назначение | Хранение примитивов и ссылок на объекты в рамках вызова метода. | Хранение всех объектов и их полей (включая массивы). | |
| Структура | Организован по принципу LIFO (Last-In-First-Out). | Древовидная структура (поколения: Young, Old). | |
| Доступ | Очень быстрый (указатель смещения). | Относительно медленнее. | |
| Размер | Ограниченный, задается при создании потока (-Xss). |
Крупный, настраивается (-Xms, -Xmx). |
|
| Управление | Автоматическое (push/pop при входе/выходе из метода). | Управляется сборщиком мусора (Garbage Collector). | |
| Потокобезопасность | Приватная область для каждого потока. | Общая для всех потоков, требует синхронизации. | |
| Время жизни | Пока выполняется метод (фрейм стека). | Пока на объект есть активная ссылка. |
Визуализация в коде:
public class MemoryDemo {
// Поле 'name' (сам объект String) - в куче. Ссылка в объекте MemoryDemo.
private String name = "Demo";
public void calculate(int value) { // 'value' и ссылка 'this' - в стеке фрейма метода
int localVar = value * 10; // Примитив 'localVar' - в стеке
Object helper = new Object(); // Сам объект Object - в куче. Ссылка 'helper' - в стеке.
// При выходе из метода фрейм очищается: localVar и ссылка helper удаляются.
// Объект Object в куче станет кандидатом на GC, если на него нет других ссылок.
}
}
Ключевой вывод: Примитивы и ссылки живут в стеке метода, а объекты, на которые они указывают, — всегда в куче.