Является ли постоянное поколение частью кучи или находится в другом пространстве в jvm - PullRequest
8 голосов
/ 07 декабря 2011

Я видел несколько комментариев по этому вопросу - некоторые говорят «да», а некоторые - «нет», и многие ответы неоднозначны.Может кто-нибудь, пожалуйста, опишите в более простых терминах, где он находится?В одном посте я даже видел, как кто-то сказал, что он разделяет ту же область памяти, что и память классов, куда классы загружаются загрузчиками классов - это правда?

Ответы [ 5 ]

3 голосов
/ 07 декабря 2011

Оригинальный (возможно, ошибочный) ответ: Если верить википедии , это часть кучи.

Редактировать: я больше об этом разбирался, включая сайт, на который ссылаютсяв комментарии ОП.В ходе этого исследования я наткнулся на этот вопрос SO , который ссылается на этот документ , который указывает, что для Sun Java (версия 6) постоянная коллекция фактически находится вне кучи.Тем не менее, я не эксперт по Java и ранее не знал о деталях управления памятью на этом уровне.Если мое чтение верно, размещение - или даже существование - постоянного поколения - это деталь реализации jvm.

2 голосов
/ 21 августа 2012

С точки зрения черного ящика, в JVM Sun постоянное поколение не является частью кучи, как указано в документации jconsole :

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

На практике это означает, что ваша -XX:MaxPermSize память в сумме составляет -Xmxпамяти в процессе JVM, поскольку постоянная генерация не включена в кучу.

1 голос
/ 23 мая 2014

У меня возник тот же вопрос при чтении Основы сборки мусора Java , в этом туториале автор рассматривает перманентную генерацию как часть кучи.

Но у нас есть оба:

  • -Xmx
  • -XX: MaxPermSize

и после гугла вопрос, я нахожу этот вопрос Терминология кучи Java: молодое, старое и постоянное поколения? , ответы из которых заключают:

постоянное поколение не является частью кучи

1 голос
/ 07 декабря 2011

Вот мое понимание темы:

Постоянное поколение - это область кучи, где хранятся определения классов.Как показано на http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation,, все экземпляры классов имеют ссылку «klass» на экземпляр класса своего типа в постоянном поколении.Когда новые типы создаются во время выполнения, в постоянном поколении выделяется новое пространство для их типов.

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

0 голосов
/ 23 ноября 2016

Permgen удален из Java 8. Теперь у нас есть метапространство, которое не является частью кучи и частью внутренней памяти.

Также команды -Xmx -XX: MaxPermSize будет игнорироваться с Java 8

http://java.dzone.com/articles/java-8-permgen-metaspace

...