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