← Назад к вопросам

Какие знаешь области в JVM?

2.2 Middle🔥 111 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Области памяти в JVM

Java Virtual Machine организует память в несколько отдельных областей, каждая из которых выполняет специфическую роль. Понимание этого разделения критически важно для оптимизации производительности и диагностики утечек памяти.

Heap (Куча)

Heap — основная область памяти, где хранятся все объекты. Это область с автоматической очисткой через механизм garbage collection. Heap разделена на две части:

Young Generation (молодое поколение):

  • Eden Space — где создаются новые объекты
  • Survivor Spaces (S0, S1) — где живут объекты, пережившие одну очистку
  • Объекты с коротким временем жизни
  • Часто собирается garbage collector (Minor GC)

Old Generation (долгоживущие объекты):

  • Хранит объекты, пережившие несколько Minor GC
  • Полная очистка (Major GC) происходит реже, но дольше
  • Обычно занимает большую часть Heap
// Пример настройки Heap размеров при запуске JVM
// java -Xms1024m -Xmx2048m MyApplication
// -Xms: начальный размер Heap (1024 MB)
// -Xmx: максимальный размер Heap (2048 MB)

Stack (Стек)

Stack — область с автоматической очисткой при выходе из области видимости. Каждый поток имеет собственный stack.

Хранит:

  • Локальные переменные примитивных типов (int, boolean, double и т.д.)
  • Ссылки на объекты (сами объекты находятся в Heap)
  • Информацию о вызовах методов (call stack)
public void example() {
    int age = 25;           // Примитив — в Stack
    String name = "Alice"; // Ссылка в Stack, значение в Heap
    // После выхода из метода: age и name удаляются из Stack
}

Преимущества: очень быстрый доступ, нет GC пауз. Недостаток: ограниченный размер (обычно несколько MB на поток).

Metaspace (было PermGen)

Metaspace — область для метаданных класса:

  • Информация о классах (байт-код, методы, поля)
  • Таблица символов
  • Данные JIT компилятора
// Настройка Metaspace (Java 8+)
// java -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=256m MyApp

В старых версиях Java (до Java 8) это называлось PermGen и входило в Heap. Переход на Metaspace устранил проблемы с переполнением при загрузке большого количества классов.

Code Cache

Code Cache — хранилище скомпилированного машинного кода, сгенерированного JIT компилятором. Когда метод часто вызывается, JIT компилирует его в машинный код для ускорения выполнения.

// Настройка размера Code Cache
// java -XX:InitialCodeCacheSize=160m -XX:ReservedCodeCacheSize=512m MyApp

Различие между Stack и Heap

ХарактеристикаStackHeap
ОчисткаАвтоматическая (scope)Garbage Collection
СкоростьОчень быстроМедленнее
РазмерОграниченный (~1-10 MB)Большой, настраиваемый
ПотокобезопасностьБезопасна (свой на поток)Требует синхронизации
Что хранитПримитивы + ссылкиВсе объекты

Off-Heap память

Вне управления JVM (например, через DirectByteBuffer):

import java.nio.ByteBuffer;

// Выделение off-heap памяти (не управляется GC)
ByteBuffer buffer = ByteBuffer.allocateDirect(1024); // 1KB

// Эта память не участвует в Garbage Collection
// Освобождается только явно или при очистке ByteBuffer

Основные области: Heap (куча для объектов с GC), Stack (стек потока для локальных переменных), Metaspace (метаданные), Code Cache (компилированный код).

Какие знаешь области в JVM? | PrepBro