Как разделен пул памяти 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”

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

4 ответов


кучу

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

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

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

  • Поколение Tenured или Старый Ген: пул, содержащий объекты, которые существовали в течение некоторого времени в пространстве survivor.

Не "кучи"

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

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

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

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


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

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

когда объекты впервые построены, они распределяются в пространстве Эдема. Если они выживают после сбора мусора, их повышают до Выжившего пространства, и если они живут там достаточно долго, они распределяются на арендованное поколение. Этот генерация мусора собирается гораздо реже.

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

enter image description here enter image description here


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


Память Кучи Java является частью памяти, выделенной JVM операционной системой.

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

enter image description here

вы можете найти более подробную информацию о Eden Space, Survivor Space, Tenured Space и постоянное поколение in ниже SE вопрос:

молодое, выдержанное и Пермское поколение

PermGen был заменен на Metaspace с момента выпуска Java 8.

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

  1. Eden Space, Survivor Space, Tenured Space являются частью памяти кучи
  2. Metaspace и Кэш кода являются частью памяти не "кучи".

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