распоряжаться загрузчиком класса - PullRequest
5 голосов
/ 31 марта 2010

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

Но это не сборщик мусора загрузчик классов.

Есть ли способ, который может помочь тому, чего я хочу достичь?

Ответы [ 5 ]

3 голосов
/ 31 марта 2010

По сути, как уже указывал @invariant, разыменование всех классов, загружаемых определенным загрузчиком классов, должно сделать сборщик мусора этим загрузчиком классов. Однако есть (по крайней мере) одно исключение: если класс сериализован, то на этот класс (и, следовательно, на его загрузчик классов) внутренне ссылаются ObjectStreamClass, который является первичным классом и поэтому никогда не собирается сборщиком мусора. Поэтому в этом случае загрузчик классов также не может быть подвергнут сборке мусора до тех пор, пока не завершится вся JVM.

См. Полное объяснение здесь , в разделе «Проблемы, связанные со сборкой и сериализацией мусора».

2 голосов
/ 31 марта 2010

Из ClassLoader doc : Every Class object contains a reference to the ClassLoader that defined it. Это предотвращает сбор вашего загрузчика. Вам также придется обнулить все ссылки на классы и экземпляры этих классов.

1 голос
/ 12 декабря 2010

ClassLoader будет собирать мусор после того, как больше нет классов, созданных ClassLoader. Существует старая ошибка ( 4950148 ), связанная с отсутствием способа явного избавления от ClassLoader, что вызывает проблемы, например, с блокировкой файлов.

Теперь это исправлено в JDK 7 , добавляющем метод URLClassLoader.close () .

1 голос
/ 31 марта 2010

есть 6-летняя ошибка в http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950148, которая, кажется, то, что вы хотите к сожалению, такая функциональность пока еще не реализована ...

0 голосов
/ 31 марта 2010

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

...