2014-02-19 2 views
3

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

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

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

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

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

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

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

+0

Какая версия tomcat вы используете? – Claudiu

+0

может стоить проверить перечисленные вещи [в этом документе] (https://plumbr.eu/blog/what-is-a-permgen-leak) – Claudiu

+0

Я тоже однажды столкнулся с утечкой пермагена. Mine использовала xpath для запроса объектов XML в Java-приложении. Конструктор документов добавлял классы, которые он сделал, когда он разбирал XML в пермагене. Он будет анализировать этот XML каждый раз, когда он изменится. Медленная утечка, но это вызывало проблемы. –

ответ

2

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

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

-XX:+TraceClassLoading -XX:+TraceClassUnloading 

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

-verbose:class 

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

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

+0

Следует отметить, что в зависимости от того, кого вы спросите и какой версии JVM вы говорите, «пермг» может включать в себя материал, который выделяется один раз при запуске и не может быть собрано. В зависимости от версии JVM/collector это может быть добавлено с объектами класса в «permgen» или может быть обработано физически или «морально» отдельно. –

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