Java: является ли «постоянная» память такой же, как permgen?

Я пытаюсь собрать информацию о случайной проблеме, с которой мы сталкиваемся, когда через несколько недель работы приложение замедляется, работает нормально, замедляется, работает нормально, причем интервалы между замедлением и нормальной работой становятся все короче и короче. Моя теория заключается в том, что со временем мы все чаще собираем мусор. Другая ключевая информация заключается в том, что мы иногда сталкивались с проблемами OOM PermGen.

Я включил verbose:gc и теперь вижу вывод GC в catalina.out. Однако я думаю, что мне нужно добавить флаг PrintGCDetails, основываясь на информации здесь:

http://www.oracle.com/technetwork/java/gc-tuning-5-138395.html

При включенном последнем флаге будет распечатана информация о сборе «постоянной» памяти. Вопрос в том, что память вызывает ошибки PermGen, или это что-то другое? И если он другой, как я могу зарегистрировать информацию, которая покажет пространство PermGen?

РЕДАКТИРОВАТЬ. К сожалению, я не могу подключить ни один из инструментов мониторинга jvm в этой среде.

РЕДАКТИРОВАТЬ - я добавил указанные параметры конфигурации, а также один для печати распределения владения, я получаю такие вещи, как

27.701: [GC 27.701: [ParNew
Desired survivor size 2162688 bytes, new threshold 4 (max 4)
- age   1:    1906560 bytes,    1906560 total
- age   2:       2064 bytes,    1908624 total
- age   3:       5064 bytes,    1913688 total
- age   4:     650368 bytes,    2564056 total
: 35684K->2678K(38336K), 0.0068580 secs] 224179K->191173K(1065664K), 0.0069700 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 

Является ли поколение ParNew перманентным пространством?

а также

 (concurrent mode failure): 25387K->31940K(1027328K), 0.2983200 secs] 50714K->31940K(1065664K), [CMS Perm : 35273K->35139K(35392K)], 0.2985210 secs] [Times: user=0.30 sys=0.00, real=0.30 secs] 
 (concurrent mode failure): 25356K->31941K(1027328K), 0.3032690 secs] 50861K->31941K(1065664K), [CMS Perm : 35264K->35129K(35392K)], 0.3034800 secs] [Times: user=0.30 sys=0.00, real=0.31 secs]

неудачи беспокоят меня.

Спасибо заранее


person hvgotcodes    schedule 02.12.2010    source источник
comment
Вы можете включить JMX и смотреть Vm с помощью VisualVM...   -  person ZeissS    schedule 02.12.2010
comment
@ZeissS, в нашей среде это невозможно, все заблокировано :(   -  person hvgotcodes    schedule 02.12.2010


Ответы (2)


Tenured и PermGen — это не одно и то же, нет. Они связаны, но не одно и то же. Точные детали зависят от реализации в JVM, которую вы используете, но из документа, на который вы ссылаетесь:

"Третье поколение, тесно связанное с постоянным поколением, — это постоянное поколение. Постоянное поколение является особенным, поскольку оно содержит данные, необходимые виртуальной машине для описания объектов, которые не имеют эквивалента на уровне языка Java. Например, объекты. описывающие классы и методы хранятся в постоянном поколении."

Интернированные строки и сведения о классах обычно хранятся в PERM, тогда как долгоживущие объекты Java TENURED.

Вот достойная статья, объясняющая PermGen (и как его настроить): http://blogs.oracle.com/jonthecollector/entry/presenting_the_permanent_generation

person Charlie Collins    schedule 02.12.2010
comment
Спасибо за ссылку. Я пропустил разъяснение срока пребывания в должности против permgen в статье, которую я разместил. Я не вижу там ничего о том, как заставить jvm сбрасывать информацию о permgen - я тоже это пропустил? - person hvgotcodes; 02.12.2010
comment
эта ссылка указывает, что флаг, который я собираюсь добавить, выводит информацию о permgen...rajakannappan.blogspot.com/2010/01/ - person hvgotcodes; 02.12.2010
comment
Да, я думаю, что обычная -XX:+PrintGCDetails (с виртуальными машинами Sun) покажет статистику PermGen. Кроме того, в более поздних комментариях я вижу, что это приложение Grails, что имеет некоторый смысл в том, что для появления PermGen потребуется некоторое время, поскольку вы манипулируете классами во время выполнения и т. д. Простое увеличение должно помочь, но из-за общей медлительности, о которой вы упомянули, вам действительно нужно выяснить, что запускать профилировщик (может быть, тестовый сервер, на который вы сильно нагрузили, чтобы попытаться воссоздать проблему, в которой вам не разрешено отслеживать prod? ). - person Charlie Collins; 02.12.2010
comment
Я имел в виду какой-то способ запустить профилировщик, и если вам не разрешено контролировать прод (опечатки, извините, но я слишком давно не замечал, поэтому не разрешено редактировать). - person Charlie Collins; 02.12.2010
comment
да, у нас есть среда контроля качества, к которой я мог бы подключиться. Чтобы проблема возникла в prod, требуются недели, у нас кварцевые задания выполняются каждые несколько минут, но это просто то, с чем мне, возможно, придется иметь дело .... Я обновил исходный вопрос ... - person hvgotcodes; 02.12.2010

Вы интернируете какие-либо строки или загружаете какие-либо классы?

Две вещи, которые у меня были, съели пространство permgen: когда вы интернируете строки, которых не должно быть (таким образом, все виды строк, собираемых без мусора, висят вокруг), и старые определения классов, вызванные загрузкой в ​​​​новые классы (обычно из-за повторного развертывания Tomcat, после дюжина или около того это может случиться для нас).

Кажется, я помню, что Tomcat 6 был лучше в вопросе повторного развертывания, и 7 должен был это исправить, но это не приходит мне в голову.

Используете ли вы какие-либо внешние библиотеки или собственные библиотеки кода? Я не удивлюсь, если ресурсы, которые они утекли, учитываются в permgen (просто предположение).

person MBCook    schedule 02.12.2010
comment
это не проблема перезапуска. У нас закончился пермген во время нормальной работы. Учтите, что это приложение Grails, поэтому во время выполнения динамически генерируются всевозможные вещи. Однако для этого я просто пытаюсь собрать информацию - как мне заставить jvm распечатать информацию о permgen? - person hvgotcodes; 02.12.2010
comment
@gvgotcodes — перезапуски просто вызывают большое количество загрузок классов. Каждый раз, когда вы изменяете определение класса, Groovy должен был бы создавать его заново, а это вызывало бы загрузку класса. Со временем этого может быть достаточно, чтобы вызвать проблему. Что касается выяснения того, что происходит, вам нужно будет использовать инструмент jstat (часть Java). Хотя это сложно. Я не могу запустить его на моем сервере в данный момент, он говорит, что не видит Java. Мониторинг JXM (который, как вы сказали, отсутствует) проще. - person MBCook; 02.12.2010