Утечки загрузчика классов Java — следующие шаги?

Мы пытаемся настроить сервер HP UX для запуска некоторых пакетных заданий на Java. Проблема в двух словах такова:

Эти пакетные задания выполняются на сервере приложений Jeus (продукт Made in Korea). Хотя большинство заданий выполняются вовремя, некоторые пакетные задания сообщают о знаменитой ошибке PermGen Out of Memory Error. Мы получили дамп кучи и начали рассматривать параметры JVM. Они следующие: Xms - 2048м Xmx - 2048м PermSize - 512м MaxPermSize - 512м. Старым сборщиком GC является CMS, а сборщиком нового поколения является Parallel Collector.

Мы заметили, что фактический размер кучи вполне нормальный и что PErm Gen исчерпал все свои 512 м памяти. HPJmeter показал, что это был постепенный рост памяти, и, следовательно, мы заподозрили утечку памяти. Мы просмотрели все загрузчики классов и обнаружили около 168 экземпляров основного ClassLoader сервера приложений Jeus. Средство оценки утечки памяти показало, что этот загрузчик классов имел утечку памяти. Он показал, что количество удерживаемых байтов составляло всего около 3 МБ.

Мы посмотрели на количество классов/типов, загруженных этим загрузчиком классов, и их было около 512 элементов. Утечка памяти также показала, что некоторые другие объекты вовлечены в утечку памяти.

У меня есть следующие вопросы:

  1. Теперь, когда обнаружен утечка Classloader, как нам определить точную ссылку(и), которая вызывает проблему?
  2. Если один загрузчик класса с определенным идентификатором объекта отображается как утечка памяти, возможно ли, что другие экземпляры одного и того же загрузчика класса пропускают некоторый различный объем памяти?
  3. Любое руководство относительно того, что делать дальше, будет высоко оценено.

Адитья.


person Aditya    schedule 18.07.2012    source источник


Ответы (1)


Вы уверены, что это «утечка» загрузчика классов, или на классы, загруженные загрузчиком, все еще ссылаются?

Поймите, что «загрузчик пользовательских классов» обычно используется для загрузки классов, которые, возможно, потребуется выгрузить позже. Например, если классы динамически генерируются как своего рода схема генерации веб-страницы, эти классы должны быть загружены в свой собственный загрузчик классов, использованы, а затем должны быть устранены все следы ссылок на классы и их загрузчики. Когда эти ссылки исчезнут, загрузчики и загруженные классы будут собраны.

Если какой-то кеш привязан к ссылкам на классы (например, путем ссылки на объекты классов или путем ссылки на классы из других классов в других загрузчиках), то сбор не происходит.

person Hot Licks    schedule 18.07.2012
comment
Я предполагаю, что какая-то ссылка может все еще висеть на некоторых классах, загруженных загрузчиком классов. Я проверил оценщик утечки памяти, предоставленный HP Jmeter, и он показал этот загрузчик классов как одну из утечек. Я хотел бы знать, есть ли возможный способ определить, какой класс/тип вызывает утечку? Этот загрузчик классов загружает около 500 классов/типов. Я предполагаю, что было бы невозможно сказать, будут ли другие экземпляры того же загрузчика класса проблемой, потому что мы не будем знать, какой класс имеет ссылку, которая все еще держится за него. Разве это не так? - person Aditya; 18.07.2012
comment
Я не знаю, какие инструменты могут быть доступны, чтобы сказать вам, какие классы загружаются какими загрузчиками классов. Я думаю, что большинство полных инструментов дампа JVM дадут вам эту информацию, если вы покопаетесь в ней. Ищите классы с именами, сгенерированными машиной (или именами, соответствующими каким-либо сценариям), и выясните, как они генерируются. - person Hot Licks; 18.07.2012