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

Я профилировал функциональный тест Java, который занимал много времени и демонстрировал случайные OOM (в куче Си, а не в Java), и я обнаружил действительно неоптимальное поведение в последовательном GC Java (и это, вероятно, применимо ко всем Java GC).

Вот пример статистики Permgen в полных точках GC из тестового прогона (размер в КБ):

before  after   commit
167935  167935  167936
172031  172031  172032

Как вы можете видеть, пространство permgen не очищается этими полными прогонами gc. Ничего страшного, но это указывает на бесполезность этих полных сборок. Кроме того, значение коммита немного забавно. Я предположил, что значение фиксации для записи журнала gc будет значением после увеличения размера фиксации. Теперь я думаю, что на самом деле это значение коммита до полного запуска GC.

Кроме того, я думаю, что размер коммитов permgen увеличивается при фиксированном, не настраиваемом размере 4 МБ (172032K - 167936K) за полный прогон GC. Это означает, что если вы начнете с размера permgen по умолчанию, скажем, 64 МБ, а когда ваше приложение будет полностью загружено, ему потребуется 128 МБ permgen, то для достижения окончательного размера фиксации потребуется 16 полных gc для permgen.

В случае функционального теста, который я профилировал, пришлось выполнить 58 полных gc, каждый из которых занимал от 0,5 до 2 секунд. Сделав аргумент jvm -XX:PermSize равным -XX:MaxPermSize, я смог уменьшить его до нуля полных сборщиков мусора (без значительного увеличения гораздо более быстрого сбора мусора нового поколения) и сократить время сбора мусора, сообщаемое инструментарием сборщика мусора. сообщения на 90%, от 90 секунд до 9 секунд.

Я просмотрел множество мест, но не смог найти другой параметр настройки для скорости роста размера коммита для кучи permgen. Это довольно уродливо, чтобы полностью выделить максимально возможный размер кучи permgen при запуске программы. Кто-нибудь знает об альтернативе увеличению PermSize до MaxPermSize, который даст аналогичные результаты без выделения такого количества памяти при запуске? Почему приращение коммитов permgen такое маленькое и фиксированное?

1 ответ

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

Должны были быть другие соответствующие параметры, относящиеся конкретно к вашему приложению, которые учитывают ваши наблюдения.

Там действительно нет задокументированной связи между увеличением permgen и сборками мусора. Permgen предназначен для хранения статических данных, используемых jvm, и, как правило, не собирается (за исключением редких случаев, то есть загрузки классов ClassLoader и последующего выхода ClassLoader из области видимости)

Другие вопросы по тегам