В JVM существуют следующие основные участки памяти:
-
Heap (Куча):
- Здесь хранятся объекты всех классов и массивы.
- Управляется сборщиком мусора.
- Делится на Generation (новые объекты), Old (старые объекты, пережившие несколько циклов GC) и Permanent Generation (до Java 8, хранил метаданные классов и статические переменные) или Metaspace (начиная с Java 8, хранит метаданные классов).
-
Stack (Стек):
- Для каждого потока исполнения создается свой стек.
- Здесь хранятся локальные переменные примитивных типов и ссылки на объекты.
- Также хранит информацию о фреймах вызовов методов, включая параметры методов и возвращаемые значения.
- Размер стека фиксирован или устанавливается при запуске JVM.
-
Method Area (Область методов):
- До Java 8 являлась частью Permanent Generation.
- Начиная с Java 8, метаданные классов хранятся в Metaspace (часто находится вне кучи).
- Хранит структуру классов, константы (из пула констант), статические переменные и байткод методов.
-
PC Register (Счетчик программ):
- Регистр, специфичный для каждого потока.
- Содержит адрес инструкции виртуальной машины, которая выполняется в данный момент.
-
Native Method Stack (Стек нативных методов):
- Для потоков, выполняющих нативные методы (написанные на других языках, например C/C++).
- Управляется операционной системой, а не JVM.
Схематично можно представить так:
plaintext