загрузка классов с помощью разных загрузчиков классов, чтобы выгрузить их из JVM, когда они не нужны

В моем приложении я использую ServiceLoader для загрузки модулей (классов из файла .jar) с помощью разных ClassLoaders, чтобы полностью выгрузить их, когда они не нужны, из контекста приложения и из самой JVM. Я знаю, что, возможно, это не обычная тема «выгрузить классы из JVM», для этого есть некоторые условия, поэтому я прилагаю необходимые усилия. Чтобы убедиться, что все работает так, как ожидалось, я отслеживаю загрузку и выгрузку классов с помощью -XX:+TraceClassLoading и -XX:+TraceClassUnloading, информация из этих параметров показывает мне, что я могу выполнить полную выгрузку любого модуля из mi и из самой JVM (выгрузка из JVM происходит во время полного GC). Все это, кажется, работает нормально... но мой вопрос в том, почему файлы .jar, из которых были загружены классы модулей, остаются открытыми JVM?, что .jars не может быть удален, но JVM говорит, что выгрузил из них классы . Очевидно, это происходит во время выполнения JVM, но зачем держать открытыми файлы .jar, если JVM не загружает из них класс? Есть ли что-нибудь, что я могу сделать, чтобы заставить JVM освободить эти файлы .jar?


person Wyvern666    schedule 08.09.2011    source источник


Ответы (1)


Проблема загрузки/выгрузки класса должна быть тщательно изучена в различных веб-контейнерах.

Некоторые гуглы показывают, что Tomcat 6.x имеет опцию antiJARLocking, эта опция используется в исходных кодах Tomcat по адресу http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk/java./org/apache/catalina/loader/

Пожалуйста, прочтите исходники, там вы найдете пример кода загрузки/выгрузки.

person ya_pulser    schedule 08.09.2011
comment
В информации о antiJARLocking говорится: если это правда, загрузчик классов Tomcat предпримет дополнительные меры, чтобы избежать блокировки файла JAR, когда доступ к ресурсам внутри JAR осуществляется через URL-адреса. Это повлияет на время запуска приложений, но может оказаться полезным на платформах или конфигурациях, где может произойти блокировка файлов. Итак, вы предлагаете сделать то же самое, что и tomcat? А JVM недостаточно умна, чтобы выпустить файл? - person Wyvern666; 09.09.2011