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

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

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

 Peter Lawrey20 нояб. 2012 г., 10:32
Как программа на Java SE, я никогда не достигал предела PermGen за 13 лет программирования на Java. Вероятно, именно такое мышление удерживает предел на низком уровне. то есть, забывая, что некоторые люди бьют его регулярно. ;) Примечание. В Java 7 пул строковых литералов находится в куче, а не в PermGen.

Ответы на вопрос(3)

Решение Вопроса

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

Тем не менее, обоснование, вероятно, заключается в следующем:

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

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

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

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

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

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

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

PermGen собирается исчезнуть в JDK8.

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

Не утомительные ресурсы.

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

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

 djangofan20 нояб. 2012 г., 18:08
Интересно. Ваш комментарий вдохновил меня на изучение причин JDK8 и использования MaxMetaspaceSize, а не MaxPermGen. Благодарю. :-)

Ваш ответ на вопрос