Коллекция пермгенов и мусора Java, Busting permgen myths

Я знаю, что в JVM область permgen используется для хранения определений классов. В моем Tomcat я вижу, что текущее использование памяти перментом составляет около 100 Мбайт, похоже, что он только растет с течением времени, даже там никто не использует приложения в Tomcat Мои вопросы:

Правда ли, что пермген никогда не собирался собирать мусор, я имею в виду, что используемая там память продолжает расти и расти?

Когда пермем получает сбор мусора?

Что означает "CMSPermGenSweepingEnabled" и "CMSClassUnloadingEnabled"?

Мой максимальный размер permgem равен 256, и я не хочу иметь OutMemoryException на следующей неделе.

Пожалуйста, только точные и документированные ответы.

Я использую Tomcat 7, Java 7, я использую много параллельного развертывания tecnique, и я делаю undeploys, перераспределяя несколько раз в неделю. Я никогда не использую метод intern() для строк

1 ответ

На самом деле это неправда, что Permgen никогда не собирает мусор. Он содержит классы, которые загружаются приложением и собираются, когда загрузчики классов получают сбор мусора, как правило, в сценариях перераспределения.

Вы можете использовать эти флаги JVM, чтобы увидеть, когда классы загружаются и выгружаются из permgen:

-XX:+TraceClassLoading -XX:+TraceClassUnloading

Чтобы узнать, какие классы загружаются, используйте этот флаг:

-verbose:class

Если приложение интенсивно отражается, это тоже может быть причиной, посмотрите на этот ответ, попробуйте использовать visualvm, чтобы взять кучи кучи для поиска классов с именем lie sun.reflect.GeneratedMethodAccessor11.

Для флагов сбора мусора обратитесь к этому answer, но лучше всего исправить утечку Permgen, чтобы увидеть, какие классы создаются и зачем использовать некоторые инструменты/журналы.

licensed under cc by-sa 3.0 with attribution.