Как разделить пул памяти Java? - PullRequest
211 голосов
/ 11 августа 2009

В настоящее время я наблюдаю за 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 ]

313 голосов
/ 11 августа 2009

кучи памяти

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

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

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

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

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

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

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

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

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

58 голосов
/ 08 мая 2016

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

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

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

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

enter image description here enter image description here

34 голосов
/ 18 июня 2014

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

19 голосов
/ 06 июня 2016

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

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

enter image description here

Вы можете найти более подробную информацию о Пространстве Эдема, Пространстве Выжившего, Арендованном Пространстве и Постоянном Поколении ниже в вопросе SE:

Молодое, штатное и пермское поколение

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

По вашим запросам:

  1. Eden Space, Survivor Space, Tenured Space являются частью кучи памяти
  2. Metaspace и Code Cache являются частью не-кучи памяти.

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

...