Я загружал свое веб-приложение в течение последних нескольких дней и заметил, что количество загруженных текущих классов, просматриваемых через мониторинг JMX, постоянно увеличивается. Он будет расти, а затем снижаться, но среднее количество загруженных классов линейно увеличивается со временем. В начале загрузки «Текущие классы загружены» было всего несколько тысяч. Теперь, однако, «Текущие загруженные классы» достигли 130 000+.
Это нормально? Я знаю, что классы будут заполнять память PermGen, но не является окончательным, утечка памяти PermGen или нет.
Used:
65,124 kbytes
Committed:
65,536 kbytes
Max:
65,536 kbytes
Используемое число колеблется между 62k и 65k, но я еще не заметил никаких катастрофических сбоев на сервере. Итак, у меня двоякий вопрос.
Во-первых, это нормально? Если это не так, приведет ли это в конечном итоге к сбою Tomcat?
Боюсь, на ваш вопрос нет четкого ответа. большую часть места в пермгене должны занимать классы вашего приложения. возможно, ваше приложение генерирует классы во время работы. тогда описанное поведение вашего приложения будет таким, как ожидалось. когда ваше приложение не генерирует классы на лету, количество загруженных классов и количество permgen должны быть более или менее статичными.
когда ваше приложение создает много классов, вы можете получить проблемы с памятью. тогда вы увидите java.lang.OutOfMemoryError: PermGen space
сообщения в журнале tomcat. вы можете проверить это, явно установив perm gen с помощью этого параметра: -XX:MaxPermSize=
.
вы также можете попробовать этот параметр: -XX:+CMSClassUnloadingEnabled
с помощью сборщика мусора cms. когда количество загруженных классов не уменьшается, у вас все еще есть ссылки из объектов на эти классы. это может быть признаком того, что у вас действительно утечка памяти. но вам обязательно нужно знать работающее приложение, чтобы быть уверенным. когда это желаемое поведение приложения, вы можете только увеличить пространство для perm gen. размер perm gen является дополнительным к размеру кучи.
Вот это публикация в stackoverflow, которая предлагает метод, чтобы прояснить, что является содержимым permgen.