Мы создаем несколько дочерних загрузчиков классов для загрузки в несколько субприложений в Java-приложение «контейнер», прототипирование горячего развертывания. Когда переменная classpath для определенного загрузчика классов была изменена (т. Е. Баночки были добавлены, удалены, обновлены), старый загрузчик классов отбрасывается (не привязывается) и создается новый загрузчик классов для нового класса маршрутов jars.Когда и как загружается классный загрузчик java для сбора мусора?
После обновления пути к классу, запускающего горячее развертывание, мы взяли кучу кучи. Дамп кучи (с использованием Memory Analyzer) указывает, что старые загрузчики классов не собирались мусором. Некоторые классы в родительском загрузчике классов кэшировали старые загрузчики классов. Следующие вещи были призваны, чтобы очистить эти тайники:
java.lang.ResourceBundle.clearCache(classLoader);
org.apache.commons.logging.LogFactory.release(classLoader);
java.beans.Introspector.flushCaches();
Даже после очистки выше кэшей, старые Загрузчики классов еще не мусор. Остальные ссылки на загрузчиком классов были включены следующие:
- классы, загруженные загрузчиком классов
- java.lang.Package создали самим загрузчиком классов
- java.lang.ProtectionDomain создатель самого загрузчиком классов
Все вышеперечисленное относится к циркулярным ссылкам в загрузчике классов, что должно приводить к сбору мусора. Я не уверен, почему это не так. Кто-нибудь знает, почему старые загрузчики классов все еще не собираются мусором, даже с круговыми ссылками?
Какой JVM вы используете (точную версию)? Используете ли вы какие-либо параметры JVM, которые могут повлиять на загрузку классов? Используете ли вы какие-либо вещи из собственных реализаций Sun? Использует ли приложение байт-код? ... Какая среда, которая может повлиять на загрузку классов? – cafebabe
Не связано с вашим главным вопросом, но вы считали что-то вроде OSGi вместо того, чтобы делать свою собственную фреймворк, которая поддерживает горячее развертывание? – SteveD
@bfoo В наших тестах мы используем Java 6. Нет параметров JVM.Мы не используем что-либо в Sun в простейшем случае. Нет манипуляции с байтовым кодом. – onejigtwojig