загрузка классов различными загрузчиками классов для выгрузки их из JVM, когда в этом нет необходимости - PullRequest
0 голосов
/ 08 сентября 2011

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

1 Ответ

0 голосов
/ 09 сентября 2011

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

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

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

...