Почему я вижу только «мертвые» загрузчики классов из jmap -permstat (кроме начальной загрузки)? - PullRequest
5 голосов
/ 12 июля 2011

Мы увеличиваем пространство памяти permgen в нашем приложении все выше и выше, и я пытаюсь выяснить, есть ли утечка какого-то рода, попадающая в область permgen. Мы не выполняем горячие действия отмены / повторного развертывания, но у нас есть много прокси, как динамических, так и сгенерированных CGLIB. Мы также делаем некоторые сложные биты загрузчика классов для поддержки различных вариантов использования, и я подозреваю, что они также могут быть возможными причинами потерь permgen.

Таким образом, я запускаю jmap -permstat в нашем запущенном приложении, надеясь получить некоторое представление о том, что может заполнить наше пространство permgen. (Я также запускаю обычный дамп кучи как с живыми, так и с мертвыми объектами, чтобы отследить подсказки, которые могут быть получены из выходных данных permstat).

Однако из 2400 загрузчиков классов, перечисленных в jmap permstat, ВСЕ, кроме загрузчика классов начальной загрузки, перечислены как «мертвые». Это не имеет смысла, поскольку приложение определенно работает и работает.

Насколько я понимаю, jmap сообщит о загрузчике классов как о "мертвых", если он будет иметь право на сборку мусора, но я, должно быть, ошибаюсь ...

Чего мне не хватает? Что здесь означает «мертвый»? Поиск в гугле не дает много ответов, кроме возможного недопонимания, которое я имею здесь.

1 Ответ

1 голос
/ 12 июля 2011

Вот несколько идей:

  1. Обновление до последней виртуальной машины.
  2. Если по какой-то причине вы используете -XX:+UseConcMarkSweepGC, убедитесь, что вы также используете -XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled
  3. Сделайте «Reference Chains from Rootset» в jhat, чтобы увидеть, кто держит экземпляр. Не забудьте исключить слабые ссылки!
  4. Этот длинный пост немного сложен, и я сам не пробовал, но, возможно, он вам поможет.
  5. Попробуйте другую виртуальную машину, например, JRockit
...