Почему существует MaxPermSize?
Java: Почему существует MaxPermSize?
Ответ 1
Вот хорошая статья о Постоянном поколении в сборщике мусора:
Представление постоянного поколения на Блог Jon Masamitsu
EDIT:
Я не видел ничего, что могло бы указать на то, почему они приняли решение о создании максимального ограничения на размер постоянного поколения. Но я думаю, что это было сделано по нескольким причинам.
-
Это значительно упрощает реализацию, GC, конечно, не являются тривиальными, поэтому упрощение вашей реализации каким-либо образом, вероятно, является хорошей идеей.
-
YAGNI (вам это не понадобится), большинство приложений загружают фиксированное количество классов и обычно не очень большие, поэтому они, вероятно, оптимизированы для обычного случая и просто выбрали нормальный стандарт и оставили его настраиваемым.
-
Предполагая, что размер вашего perm gen растет непредсказуемо большим, вы, вероятно, имеете ошибку в загрузчике классов (или вам нужно переосмыслить свою архитектуру). Даже в приложениях, которые генерируют классы во время выполнения (или делают другие подобные трюки), количество сгенерированных классов обычно фиксируется, поэтому вы должны иметь возможность настраивать maxperm в соответствии с вашими потребностями.
-
Я не разбираюсь во всех деталях загрузки java-класса и сборки мусора, но они являются сложными частями JVM, поэтому я предполагаю, что они попытаются сохранить эти два компонента как можно более ортогональными и позволять поскольку динамический динамический динамик мог бы сочетаться с этими двумя компонентами сложным образом (особенно потому, что оба компонента имеют серьезные проблемы с потоками)
-
Вероятно, есть некоторые преимущества в производительности, связанные с ограничением генерации max perm, что позволяет ей расти, может потребоваться дополнительное копирование коллекции, или это может означать, что ваше пермское поколение больше не существует в смежном адресном пространстве, что может как ваши другие алгоритмы работают для управления коллекцией.
Очевидно, это все предположения. Но даже если все это неправильно, я определенно не думаю, что "идиотский" для солнца выбрал фиксированный размер, вероятно, есть еще больше соображений в области разработки и внедрения, чем я мог даже мечтать:)
Ответ 2
Чтобы представить немного другую перспективу, IBM JVM не имеет подмножества, а скорее выходит в ОС и выделяет куски памяти по мере необходимости. (слухи, что jrockit делает то же самое, но я не могу подтвердить это точно.)
Это выгодно тем, что вы не собираетесь ударять (по-видимому) произвольный лимит и должны настраивать его для законных ситуаций роста.
С другой стороны, это проблема для приложений с убедительностью (которые, по сути, являются тестами утечки) - JVM будет по существу идти и потреблять всю память в адресном пространстве. Это может привести к ошибке, когда собственный код внезапно выйдет из строя вызовы malloc() или Java, разбивающимся нечетными способами - например, неспособным выделить новые потоки (которые потребляют память для стека). Другим недостатком является то, что он не обеспечивает "определенную стоимость" о том, сколько памяти будет потребляться JVM.
Итак, это компромисс - как вы хотите потерпеть неудачу в сценариях "потенциального вреда"?
Ответ 3
Используется для увеличения максимальной постоянной генерации. В некоторых algos или если вы используете много и много и много разных классов, вы можете использовать это. Дайте этот прочитанный.
Но в основном он использовался как вопрос на экзаменах......
Ответ 4
Он существует, потому что он помогает настраивать подсистему сбора мусора в JVM. В зависимости от базовой архитектуры и управления памятью реализация JVM может иметь субоптимальную сборку мусора (например, слишком сложную)... Вы можете указать MaxPermSize вручную, а не рассчитывать, чтобы приложение работало плавно...
Ответ 5
Постоянное поколение используется для отображения отражающей самой виртуальной машины, такой как объекты класса и объекты метода. Эти отражающие объекты выделяются непосредственно в постоянное поколение, и он независимо от других поколений. Как правило, размер этого поколения можно игнорировать, поскольку размер по умолчанию является достаточным. Однако программам, загружающим многие классы, может потребоваться большее постоянное поколение.
PermSize - дополнительное отдельное пространство кучи для значения -Xmx, заданного пользователем. Раздел кучи, зарезервированный для постоянного поколения, содержит все отражающие данные для JVM. Вы должны соответствующим образом настроить размер, если ваше приложение динамически загружает и выгружает множество классов, чтобы оптимизировать производительность. В основном, куча хранит объекты, а perm gen хранит информацию об объектах внутри нее. Поэтому, чем больше куча, тем больше должно быть пермское gen.
По умолчанию MaxPermSize будет 32 МБ для -клиента и 64 МБ для -server. Однако, если вы не установите как PermSize, так и MaxPermSize, общая куча не увеличится, если это не понадобится. Когда вы устанавливаете как PermSize, так и MaxPermSize, например, 192mb, дополнительное кучное пространство будет выделено при запуске и останется выделенным.
Ответ 6
Возможно, вы хотите дать своему пользователю возможность указать, сколько памяти займет ваше приложение, да, у ОС есть предел и она все равно остановит его, но, возможно, пользователь захочет ограничить его в настройках приложений поэтому они могут делать другие вещи с этой памятью позже в тот же день, не разбивая ваше приложение, потому что оно УЖЕ заняло это пространство и не может его освободить, потому что оно его использует. Поэтому в меню настроек у вас есть "максимальный объем памяти, который мы используем", ползунок, и они могут регулировать его, что соответственно настраивает MaxPermSize
.
Ответ 7
Устанавливая параметр MaxPermSize, ваше приложение будет запускать ошибку GC Out of Memory при запуске, так что вы не думаете, что ваше приложение запущено, и вы звоните своим клиентам, потому что система не работает или очень вялая.
Скажем, у вас есть 4gb на вашей виртуальной машине, и вы знаете, что вам нужно 2gb не-perm пространства для вашего приложения, чтобы достичь согласованных по контракту показателей производительности. Если ваш перманентный ген будет занимать больше 2 гб, нет смысла запускать приложение, потому что вы не сможете выполнить свои показатели эффективности, указанные в вашем заявлении о работе.
Лучше знать, что при запуске и увеличении объема памяти в окне или перенастройке вашей виртуальной машины, чтобы получить больше физической памяти сервера (независимо от того, что может быть), чем при запуске приложения, разрешите классы, ehcache, или что еще загружать, подумайте, все в порядке, а затем узнайте от ваших клиентов, что система занимает 10 секунд, чтобы загрузить страницу.