Как распределяется пул памяти Java?

В настоящее время я просматриваю приложение Java с помощью jconsole. На вкладке памяти вы можете выбрать между:

Heap Memory Usage
Non-Heap Memory Usage
Memory Pool "Eden Space"
Memory Pool "Survivor Space"
Memory Pool "Tenured Gen"
Memory Pool "Code Cache"
Memory Pool "Perm Gen"

В чем разница между ними?

Ответ 1

Память кучи

Память кучи - это область данных времени выполнения, из которой Java VM выделяет память для всех экземпляров классов и массивов. Куча может иметь фиксированный или переменный размер. Сборщик мусора представляет собой автоматическую систему управления памятью, которая восстанавливает кучную память для объектов.

  • Eden Space: пул, из которого память первоначально выделена для большинства объектов.

  • Survivor Space: пул, содержащий объекты, которые остались в мусорной коллекции пространства Эдена.

  • Настроенное поколение: пул, содержащий объекты, которые в течение некоторого времени существовали в оставшемся в живых.

Память без кучи

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

  • Постоянное поколение: пул, содержащий все отражающие данные самой виртуальной машины, такие как объекты класса и метода. При использовании виртуальных машин Java, использующих совместное использование классов, это поколение разделяется на области только для чтения и чтения-записи.

  • Кэш кода: виртуальная машина Java HotSpot также включает в себя кеш-код, содержащий память, которая используется для компиляции и хранения собственного кода.

Вот некоторая документация о том, как использовать Jconsole.

Ответ 2

Новое ключевое слово выделяет память в куче Java. Куча является основным пулом памяти, доступным для всего приложения. Если памяти недостаточно для выделения для этого объекта, JVM пытается вернуть некоторую память из кучи с помощью сборщика мусора. Если он все еще не может получить достаточную память, вызывается OutOfMemoryError, и JVM завершает работу.

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

Когда объекты сначала создаются, они выделяются в пространстве Eden. Если они выживут в мусорной коллекции, их продвигают в Survivor Space, и если они там живут достаточно долго, они распределяются на Теневое поколение. Это поколение - сбор мусора гораздо реже.

Существует также четвертое поколение, называемое постоянным поколением, или PermGen. Объекты, которые здесь находятся, не могут быть собраны в мусор и обычно содержат неизменяемое состояние, необходимое для запуска JVM, например определения классов и пул констант String. Обратите внимание, что пространство PermGen планируется удалить из Java 8 и будет заменено новым пространством под названием Metaspace, которое будет храниться в собственной памяти. ссылка: http://www.programcreek.com/2013/04/jvm-run-time-data-areas/

введите описание изображения здесь введите описание изображения здесь

Ответ 3

В Java8 область без кучи больше не содержит PermGen, но Metaspace, которая является серьезным изменением в Java8, должна избавиться от ошибок в памяти с помощью java, поскольку размер метаданных может быть увеличен в зависимости от пространства, требуемого jvm для класса данных.

Ответ 4

Явная память Java - часть памяти, выделенной JVM операционной системой.

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

введите описание изображения здесь

Более подробную информацию о Eden Space, Survivor Space, Tenured Space и Permanent Generation вы можете найти ниже в разделе SE:

Молодежь, теневое и пермское поколение

PermGen был заменен на Metaspace с версии Java 8.

Относительно ваших запросов:

  • Eden Space, Survivor Space, Tenured Space являются частью памяти кучи.
  • Metaspace и Code Cache являются частью памяти без кучи.

Codecache: Виртуальная машина Java (JVM) создает собственный код и сохраняет его в области памяти, называемой кодеке. JVM генерирует собственный код по разным причинам, в том числе для динамически созданного цикла интерпретатора, заглушки Java Native Interface (JNI) и для методов Java, которые скомпилированы в собственный код компилятором точно в срок (JIT). JIT является самым большим пользователем кодека.