Ответ
Стек (Stack) — это область памяти, работающая по принципу LIFO (Last-In-First-Out), выделяемая для каждого потока. В стеке хранятся:
- Примитивные переменные локальных методов.
- Ссылки на объекты (сами объекты лежат в куче).
- Вызовы методов и информация о возврате.
Куча (Heap) — это общая, динамически выделяемая область памяти, доступная всем потокам. В куче хранятся:
- Все объекты (экземпляры классов).
- Массивы.
Пример:
void exampleMethod() {
int primitive = 42; // Примитив хранится в стеке.
Object objRef = new Object(); // Ссылка `objRef` — в стеке, сам объект Object — в куче.
}
| Сравнительная таблица: | Критерий | Стек (Stack) | Куча (Heap) |
|---|---|---|---|
| Назначение | Хранение вызовов методов и локальных примитивов/ссылок. | Хранение всех объектов и массивов. | |
| Управление | Автоматическое (при входе/выходе из метода). | Управляется сборщиком мусора (Garbage Collector). | |
| Размер | Ограничен, обычно меньше. Может привести к StackOverflowError. |
Большой, ограничен настройками JVM/системой. Может привести к OutOfMemoryError. |
|
| Скорость | Высокая (аллокация — просто перемещение указателя). | Ниже (требуется управление памятью и возможная дефрагментация). | |
| Потокобезопасность | Каждый поток имеет свой стек (thread-local). | Общая для всех потоков (требует синхронизации). | |
| Время жизни | Данные живут, пока выполняется метод (фрейм стека). | Объекты живут до тех пор, пока на них есть ссылки и их не удалит GC. |