Middle
67
questionbank

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

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

В 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++).
    • Освобождается при завершении нативного метода.
java

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

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