Java: почему существует MaxPermSize? - PullRequest
28 голосов
/ 28 июля 2010

Почему существует MaxPermSize?

Ответы [ 7 ]

22 голосов
/ 28 июля 2010

Вот хорошая статья о постоянном поколении в сборщике мусора:

Представление постоянного поколения в Интернет-журнал Джона Масамицу

РЕДАКТИРОВАТЬ:

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

  1. Это значительно облегчает реализацию, GC явно не тривиальны, так что упрощение вашей реализации в любом случае, вероятно, хорошая идея.

  2. YAGNI (Вам это не понадобится) большинство приложений загружают фиксированное количество классов, и обычно оно не особенно велико, поэтому они, вероятно, оптимизированы для общего случая и просто выбрали вменяемое значение по умолчаниюи оставил его настраиваемым.

  3. Если предположить, что размер вашей персоны растет непредсказуемо большим, то вы, вероятно, имеете ошибку в загрузчике классов (или вам нужно переосмыслить свою архитектуру).Даже в приложениях, которые генерируют классы во время выполнения (или выполняют другие подобные трюки), число сгенерированных классов также обычно фиксировано, поэтому вы должны иметь возможность настроить maxperm в соответствии со своими потребностями.

  4. Я не эксперт по всем деталям загрузки java-классов и сборки мусора, но они оба являются сложными частями JVM, поэтому я представляю, что они попытаются сделать эти два компонента настолько ортогональными, насколько это возможно, и с учетом пермидинамический рост gen мог бы, вероятно, сложным образом соединить эти два компонента (особенно потому, что оба компонента имеют серьезные соображения по поводу потоков)

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

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

6 голосов
/ 29 июля 2010

Чтобы представить немного иную перспективу, IBM JVM не имеет permgen, а скорее выходит в ОС и распределяет порции памяти по мере необходимости. (Ходят слухи, что jrockit делает то же самое, но я точно не могу это подтвердить.)

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

С другой стороны, это проблема для сбежавших приложений (которые, по сути, пропускают классы) - JVM по существу пойдет и будет использовать всю память в адресном пространстве. Это может привести к ошибкам, когда нативный код внезапно завершится ошибкой вызовов malloc (), или Java будет работать нечетным образом - например, не сможет выделить новые потоки (которые потребляют память для стека). Еще одним недостатком является то, что он не обеспечивает «определенности стоимости» в отношении того, сколько памяти будет занимать часть JVM.

Так что это компромисс - как вы хотите потерпеть неудачу в сценариях "потенциальной вредности"?

0 голосов
/ 28 февраля 2014

При настройке MaxPermSize ваше приложение выдает ошибку GC Out of Memory при запуске, так что вы не думаете, что ваше приложение запущено и работает, и ваши клиенты звонят, потому что система не работает или работает очень медленно .

Допустим, у вас есть 4 ГБ на вашей виртуальной машине, и вы знаете, что вам нужно 2 ГБ свободного пространства, чтобы приложение достигло согласованных в контракте показателей производительности. Если ваша учетная запись будет занимать более 2 ГБ, запуск приложения не имеет смысла, потому что вы не сможете соответствовать показателям производительности, указанным в вашем техническом задании.

Лучше знать об этом при запуске и получить больше памяти в коробке, либо перенастроить виртуальную машину так, чтобы она занимала больше памяти физического сервера (в любом случае), чем запускать приложение, разрешать классы, ehcache или что-то еще, чтобы загрузить, подумайте, что все в порядке, а затем узнайте от своих клиентов, что системе требуется 10 секунд для загрузки страницы.

0 голосов
/ 16 мая 2013

Возможно, вы хотите дать своему пользователю возможность выбора объема памяти, которое занимает ваше приложение, да, у ОС есть ограничение, и оно все равно его остановит, но, возможно, пользователь хочет иметь возможность ограничить его в настройках приложения. так что они могут делать другие вещи с этой памятью позже в тот же день, не разрушая ваше приложение, потому что оно УЖЕ заняло это пространство и не может освободить его, потому что оно его использует. Таким образом, в меню настроек у вас есть ползунок «Максимальный объем памяти, который мы используем», и они могут отрегулировать его, который соответственно настраивает MaxPermSize.

0 голосов
/ 21 марта 2013

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

PermSize - это дополнительное отдельное пространство кучи к значению -Xmx, установленному пользователем. Раздел кучи, зарезервированный для постоянного поколения, содержит все отражающие данные для JVM. Вы должны соответствующим образом изменить размер, если ваше приложение динамически загружает и выгружает много классов, чтобы оптимизировать производительность. По сути, в куче хранятся объекты, а в хранилище хранится информация об объектах внутри него. Следовательно, чем больше куча, тем больше должна быть пермьен.

По умолчанию MaxPermSize будет 32 МБ для -client и 64 МБ для -server. Однако, если вы не установите оба параметра PermSize и MaxPermSize, общая куча не увеличится, если в этом нет необходимости. Когда вы устанавливаете PermSize и MaxPermSize, например, 192 МБ, дополнительное пространство кучи будет выделено при запуске и останется выделенным.

0 голосов
/ 28 июля 2010

Он существует потому, что помогает настроить подсистему сбора мусора в JVM.В зависимости от базовой архитектуры и управления памятью реализация JVM может иметь неоптимальную сборку мусора (например, слишком хитрую) ... Вы можете указать MaxPermSize вручную, а не рассчитать его так, чтобы приложение работало гладко ...

Страница Java GC говорит больше ...

0 голосов
/ 28 июля 2010

Используется для определения максимального постоянного поколения.В некоторых алгоритмах или если вы используете много-много-много разных классов, вы можете использовать это.* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * *1003* * * * * * * * * * * 1004 '*.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...