Ответ
JVM разделяет память на несколько ключевых областей, каждая со своей целью и жизненным циклом:
| Область | Назначение | Управление | Ключевые особенности |
|---|---|---|---|
| Heap (Куча) | Хранение всех объектов и массивов. | Сборщик мусора (Garbage Collector). | Делится на Young Generation (Eden, Survivor spaces) и Old Generation. Основная область работы GC. |
| Stack (Стек) | Хранение локальных переменных (примитивы, ссылки) и вызовов методов для каждого потока. | Автоматически (при выходе из метода кадр стека удаляется). | Каждый поток имеет свой стек. Переполнение вызывает StackOverflowError. |
| Metaspace | Хранение метаданных классов (структуры классов, методы, константы пула). | JVM (нативная память ОС). | Заменила PermGen (до Java 8). Динамически растет в пределах, заданных -XX:MaxMetaspaceSize. |
| Native Memory (Off-Heap) | Память, выделяемая JVM или приложением, но вне кучи. | Программист / JNI / NIO. | Используется, например, DirectByteBuffer или большие структуры через JNI. Не управляется GC Java. |
Пример и объяснение:
public class Example {
private Object instance = new Object(); // Объект -> Heap
public void method() {
int localVar = 42; // Примитив -> Stack (кадр метода 'method')
Object ref = instance; // Ссылка 'ref' -> Stack, сам объект -> Heap
}
}
Почему это важно? Понимание областей памяти критично для:
- Производительности: Настройка размеров кучи (
-Xmx,-Xms) и Metaspace. - Отладки: Анализ
OutOfMemoryError(Heap vs Metaspace vs Native). - Многопоточности: Локальные переменные потока изолированы в его стеке.