Память 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 отвечает сборщик мусора (Garbage Collector). Он автоматически освобождает память от объектов, на которые нет активных ссылок.
Пример работы с Heap и Stack:
java
Разница между Heap и Stack:
- Heap: Общая для всех потоков, хранит объекты, управляется GC.
- Stack: Принадлежит отдельному потоку, хранит примитивы и ссылки на объекты, управляется фреймами методов.
Управление памятью в JVM включает:
- Распределение (Allocation) памяти при создании объектов.
- Освобождение (Deallocation) памяти неиспользуемых объектов (сборка мусора).
- Оптимизация использования памяти.