Подтвердить что ты не робот

Когда и как загружается класс java classloader для сбора мусора?

Мы создаем несколько дочерних загрузчиков классов для загрузки в несколько субприложений в Java-приложение "контейнер", прототипирование горячего развертывания. Когда переменная classpath для определенного загрузчика классов была изменена (т.е. Баночки были добавлены, удалены, обновлены), старый загрузчик классов отбрасывается (не привязывается) и создается новый загрузчик классов для нового класса маршрутов jars.

После обновления пути к классам, запускающего горячее развертывание, мы взяли кучу кучи. Дамп кучи (с использованием Memory Analyzer) указывает, что старые загрузчики классов не собирались мусором. Некоторые классы в родительском загрузчике классов кэшировали старые загрузчики классов. Для очистки этих кешей были использованы следующие действия:

java.lang.ResourceBundle.clearCache(classLoader);
org.apache.commons.logging.LogFactory.release(classLoader);
java.beans.Introspector.flushCaches();

Даже после очистки указанных кешей старый загрузчик классов по-прежнему не собирался сбор мусора. Остальные ссылки на загрузчик классов включали следующее:

  • классы, загруженные загрузчиком классов
  • java.lang.Package, созданный самим загрузчиком классов
  • java.lang.ProtectionDomain, созданный самим загрузчиком классов

Все вышеперечисленное относится к циклическим ссылкам в загрузчике классов, что должно приводить к сбору мусора. Я не уверен, почему это не так. Кто-нибудь знает, почему старые загрузчики классов по-прежнему не собираются мусором даже с круговыми ссылками?

4b9b3361

Ответ 1

Я всегда слышал, что разгрузка Classloader была проблематичной. Они теоретически сбор мусора, когда нет ссылки на экземпляры объекта, и разгрузка классов не требуется, но на практике кажется, что это более проблематично, Тонкие ссылки могут протекать и препятствовать возврату Classloader. На серверах приложений после многочисленных циклов повторного развертывания я иногда получал OutOfMemoryError: PermGen space.

Все, что сказать, что я думаю, что есть какая-то неприятная ссылка, которая мешает ей собираться - возможно, анализатор памяти не правильно следил за ссылкой. Кажется, все это может произойти, как описано в этих статьях:

Кроме того, я не знаю точно, что вы делаете, но если вы можете дождаться JDK 7, вы можете взглянуть на AnonymousClassLoader. Они будут представлены для лучшей поддержки динамического языка, как объясняется в этом сообщении:

Надеюсь, это поможет вам.