Назад к вопросам
Middle
101
questionbank

Как устроена память в Java?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

В Java память управляется автоматически сборщиком мусора и делится на несколько областей:

  1. Heap (Куча):

    • Хранит объекты классов и массивы.
    • Одна на все потоки приложения.
    • Garbage Collector работает с этой областью.
    • Разделена на поколения (Young, Old, Permanent).
  2. Stack (Стек):

    • Каждый поток имеет свой стек.
    • Хранит локальные переменные примитивных типов и ссылки на объекты в куче.
    • Данные добавляются и удаляются по принципу LIFO (Last-In, First-Out).
    • Автоматически освобождается при завершении метода.
  3. Method Area (Область методов) / PermGen (до Java 8) / Metaspace (начиная с Java 8):

    • Хранит информацию о загруженных классах:
      • Метаданные классов.
      • Байт-код методов.
      • Статические переменные.
      • Константы пула.
    • Размер PermGen был фиксированным, Metaspace использует нативную память и может динамически расширяться.
  4. Native Method Stacks (Стек нативных методов):

    • Используется для вызовов нативных методов (например, C/C++).
    • Освобождается при завершении нативного метода.
// Пример использования памяти
public class MemoryExample {

    private String instanceVariable; // Хранится в Heap

    public void myMethod(int parameter) { // parameter хранится в Stack

        int localVar = 10; // localVar хранится в Stack

        String localString = "hello"; // "hello" в String Pool (часть Heap/Method Area), localString ссылка в Stack

        Object obj = new Object(); // Object в Heap, obj ссылка в Stack

        Integer wrapper = new Integer(5); // Integer в Heap, wrapper ссылка в Stack
    }

    public static void main(String[] args) {
        MemoryExample example = new MemoryExample();
        example.myMethod(20);
    }
}

Области памяти и их содержимое:

Область Где находится? Что хранит? Управление
Heap Общая для JVM Объекты, массивы Garbage Collector
Stack Своя для каждого потока Локальные примитивы, ссылки на объекты Автоматическое (при завершении метода)
Method Area Общая для JVM Метаданные классов, статические переменные, байт-код, константы Garbage Collector (для классов и статики)
Native Stacks Своя для каждого потока (при вызове) Переменные и данные нативных методов Автоматическое (при завершении нативного метода)