Почему размер PermGen по умолчанию такой маленький?

Какова была бы цель ограничения размера пространства Permgen на Java JVM? Почему бы не всегда устанавливать его равным максимальному размеру кучи? Почему Java по умолчанию использует такое небольшое количество - 64 МБ? Пытаются ли они этим заставить людей замечать проблемы перманентности в своем коде?

Если мое приложение использует 85 МБ permgen, тогда может быть безопасно установить его на 96 МБ, но зачем устанавливать его таким маленьким, если это просто часть основной кучи? Разве не было бы эффективным позволить JVM использовать столько PermGen, сколько позволяет куча?


person djangofan    schedule 20.11.2012    source источник
comment
Как программа Java SE, я ни разу не достиг предела PermGen за 13 лет программирования на Java. Скорее всего, это будет такое мышление, которое удерживает предел на низком уровне. то есть забывая, что некоторые люди бьют его регулярно. ;) Примечание. В Java 7 пул строковых литералов находится в куче, а не в PermGen.   -  person Peter Lawrey    schedule 20.11.2012


Ответы (3)


С концептуальной точки зрения программист может возразить, что «постоянное поколение» в значительной степени бессмысленно. Если вам нужно загрузить класс или другие «постоянные» данные и остается место в памяти, то в принципе вы можете просто загрузить его куда-нибудь и вообще не заботиться о том, чтобы вызвать совокупность этих элементов «генерацией».

Однако причина, вероятно, больше в том, что:

  • есть потенциальная выгода (например, с точки зрения кэша процессора) от размещения всех метаданных кода / класса рядом в пространстве памяти, и, чтобы гарантировать это, легче выделить область (области) фиксированного размера;
  • аналогично, пространство памяти, в котором хранятся метаданные кода / класса, потенциально имеет определенные «особые» свойства (в частности, вы не хотите, чтобы он выгружался на диск, если вы можете помочь), и система может не иметь возможности установить такие свойства в памяти очень детально, так что более практично объединить все "специальные" объекты в один (или небольшое количество) непрерывный блок или пространство памяти;
  • наличие постоянных объектов вместе помогает избежать фрагментации оставшегося пространства памяти, и, опять же, наиболее практичный способ сделать это - с самого начала выделить один непрерывный блок памяти фиксированного размера.

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

С другой стороны, для программиста ситуация обычно не ужасна: количество необходимой постоянной генерации обычно предсказуемо, так что вы должны иметь возможность выделить необходимое количество с приличной свободой действий. Так что, если вы обнаружите, что неожиданно превышаете выделение, это вполне может быть сигналом о том, что «что-то серьезное не так».

N.B. Вероятно, некоторые из проблем, для решения которых изначально был разработан PermGen, не являются такими уж большими проблемами для современных 64-битных процессоров с более крупными кэшами процессора. Если он будет удален в будущих выпусках Java, это, вероятно, знак того, что разработчики JVM считают, что теперь он «выполнил свою задачу».

person Neil Coffey    schedule 20.11.2012

PermGen должен исчезнуть в JDK8.

Какова была бы цель ограничения размера пространства Permgen на Java JVM?

Не истощая ресурсы.

Почему бы не всегда устанавливать его равным максимальному размеру кучи?

PermGen не является частью кучи Java. Кроме того, даже если бы это было так, приложение не могло бы сильно помочь заполнить кучу метаданными класса и константными строками, поскольку вместо этого вы бы получили ошибку «OutOfMemoryError: размер кучи Java».

person Frank Pavageau    schedule 20.11.2012
comment
Интересный. Ваш комментарий вдохновил меня на исследование причин этого в JDK8 и на использование MaxMetaspaceSize, а не MaxPermGen. Спасибо. :-) - person djangofan; 20.11.2012

PermGen - это место, где размещаются данные class и другие статические данные (например, строковые литералы).

Вы бы предпочли выделить память в куче Java для данных вашего приложения (Xms и Xmx, где молодые (недолговечные) и постоянные объекты go (когда JVM понимает, что им нужно оставаться дольше)).

Таким образом, историческое значение по умолчанию PermGen 64 МБ может быть произвольным, но его явная установка позволяет вам знать (и контролировать), сколько статических данных ваше приложение заставляет хранить JVM.

person Faiz    schedule 20.11.2012