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

Какие ещё области памяти есть в JVM: heap, stack, metaspace, code cache, thread-local (TLAB и т.п.)

1️⃣ Как кратко ответить

В JVM память организована в несколько областей: Heap для динамически создаваемых объектов, Stack для хранения вызовов методов и локальных переменных, Metaspace для хранения метаданных классов, Code Cache для хранения скомпилированного JIT-кода, и Thread-Local Allocation Buffers (TLAB) для оптимизации распределения памяти потоками.

2️⃣ Подробное объяснение темы

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

Heap

Heap — это область памяти, где размещаются все объекты, созданные в Java-программе. Она управляется сборщиком мусора (Garbage Collector), который освобождает память, занятую объектами, на которые больше нет ссылок. Heap делится на несколько поколений:

  • Young Generation: Здесь создаются новые объекты. Она, в свою очередь, делится на Eden Space и два Survivor Space. Большинство объектов умирает молодыми, и сборка мусора здесь происходит чаще.
  • Old Generation (Tenured): Объекты, которые пережили несколько циклов сборки мусора в Young Generation, перемещаются сюда. Сборка мусора здесь происходит реже, но занимает больше времени.
  • Permanent Generation (до Java 8): Хранила метаданные классов и методы. В Java 8 заменена на Metaspace.

Stack

Stack — это область памяти, используемая для хранения вызовов методов и локальных переменных. Каждый поток имеет свой собственный стек, что делает его безопасным для потоков. Стек управляется по принципу LIFO (Last In, First Out). Когда метод вызывается, создается новый фрейм в стеке, и он удаляется, когда метод завершает выполнение.

Metaspace

Metaspace — это область памяти, введенная в Java 8, которая заменила Permanent Generation. Она хранит метаданные классов, такие как информация о методах и полях. Metaspace выделяется из нативной памяти, а не из Heap, что позволяет избежать проблем с ограничением размера, характерных для Permanent Generation.

Code Cache

Code Cache — это область памяти, где хранится скомпилированный JIT (Just-In-Time) компилятором код. JIT компилирует часто вызываемые методы в машинный код для повышения производительности. Code Cache позволяет JVM быстро выполнять скомпилированный код без необходимости повторной интерпретации.

Thread-Local Allocation Buffers (TLAB)

TLAB — это небольшие участки памяти в Heap, выделенные для каждого потока. Они используются для оптимизации распределения памяти, уменьшая конкуренцию между потоками при создании новых объектов. Каждый поток может быстро выделять память в своем TLAB, что снижает накладные расходы на синхронизацию.

Пример кода

Рассмотрим простой пример, чтобы понять, как объекты размещаются в Heap и как работает Stack:

public class MemoryExample {
    public static void main(String[] args) {
        // Создание объекта в Heap
        Person person = new Person("John", 30);
        // Вызов метода, который создает локальные переменные в Stack
        printPersonDetails(person);
    }
​
    public static void printPersonDetails(Person person) {
        // Локальные переменные name и age хранятся в Stack
        String name = person.getName();
        int age = person.getAge();
        System.out.println("Name: " + name + ", Age: " + age);
    }
}
​
class Person {
    private String name;
    private int age;
​
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public String getName() {
        return name;
    }
​
    public int getAge() {
        return age;
    }
}
  • Heap: Объект Person создается в Heap, и его поля name и age также размещаются здесь.
  • Stack: Метод main и printPersonDetails имеют свои фреймы в стеке, где хранятся ссылки на объект Person и локальные переменные name и age.

Понимание этих областей памяти помогает разработчикам оптимизировать использование памяти и улучшать производительность приложений на Java.

Тема: JVM и память
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки