2010-07-28 2 views

ответ

0

Его использовали для увеличения максимальной постоянной мощности. В некоторых algos или если вы используете много и много и много разных классов, вы можете использовать это. Дайте this one a прочитайте.

Но в основном он используется в качестве вопроса на экзаменах ......

+5

Это просто говорит, что это такое, оно не объясняет, почему оно существует в первую очередь. –

0

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

Java GC Page says more...

+4

Но почему у вас максимальный размер? Почему бы не допустить, чтобы он вырос до тех пор, пока вы не достигли ограничения на размер памяти процесса? –

+0

@JonathanAllen Я видел проблемы, прежде чем в решениях для виртуализации на основе контейнеров (OpenVZ), где Java или какой-либо другой процесс увидел доступную память физического хоста и/предположил /, что у него было много доступной памяти. В конце концов, контроллер контейнера убил процесс для превышения предела памяти. «MaxPermSize» может помочь в таком сценарии, позволив мне сообщить VM, сколько памяти действительно доступно для него. – BSchlinker

22

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

Presenting the Permanent Generation на Jon Masamitsu's Weblog

EDIT:

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

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

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

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

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

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

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

+4

Это ничего не говорит о том, почему они решили дать ему произвольный максимальный размер. Если бы это было похоже на любое другое приложение, вы бы просто выделили ему больше места за раз, пока не достигли предела ОС. –

+0

Если им не нужно предварительно выделить всю кучу как непрерывный блок, который я не верю, вы на самом деле добавляете сложность, вводя максимальный размер. И в отличие от стека потока, я не могу думать о какой-либо причине, почему вам нужен непрерывный блок. –

+1

Размер perm gen управляется иначе, чем «регулярная» куча (связанная статья упоминает об этом), и на самом деле она предопределена. – luke

6

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

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

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

Итак, это компромисс - как вы можете потерпеть неудачу в сценариях «потенциального вреда»?

0

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

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

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

0

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

0

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

Предположим, у вас есть 4gb на вашей виртуальной машине, и вы знаете, что вам нужно 2gb не-perm-пространства для вашего приложения, чтобы достичь согласованных по контракту показателей производительности. Если ваш перманентный ген будет занимать больше 2 гб, нет смысла запускать приложение, потому что вы не сможете выполнить свои показатели эффективности, перечисленные в вашем заявлении о работе.

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

+0

Нет, MaxPermSize не гарантирует выполнение вашего приложения при запуске, если он загружает слишком много классов. Java может (и будет) загружать классы во время выполнения по мере необходимости, поэтому предел может быть превышен только тогда, когда, например, определенный метод запускается в первый раз и загружает требуемый класс. – sleske

Смежные вопросы