Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Однако, скорее всего, это логическое обоснование:

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

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

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

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

Ответ 2

PermGen установлен на исчезновение в JDK8.

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

Не исчерпывающие ресурсы.

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

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

Ответ 3

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

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

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