Я использую пользовательский загрузчик класса, который расширяет URLClassLoader. Я загружаю некоторые классы в свой пользовательский загрузчик класса и выполняю некоторую задачу. После того как задача выполнена, я хочу избавиться от загрузчика класса. Я пытался делать это путем установки ссылки в NULL.
Но это не собирает "мусор" загрузчик класса.
Существует ли путь, который может помочь тому, чего я хочу достигнуть?
Пока есть ссылка на любой из классов, загруженных этим загрузчиком классов, загрузчик классов не будет собираться сборщиком мусора. Таким образом, загрузчик классов будет удален, если: все прямые ссылки на загрузчик классов обнулены, все ссылки на классы, загруженные этим загрузчиком классов, и на экземпляры этих классов. Затем его можно выгрузить при следующем запуске сборщика мусора.
Из ] ClassLoader doc : Каждый объект Class содержит ссылку на ClassLoader, который его определил
. Это предотвращает сбор вашего загрузчика. Вам также придется обнулить все ссылки на классы и экземпляры этих классов.
ошибка 6-летней давности на http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950148 , похоже, именно то, что вам нужно. к сожалению, такая функциональность, похоже, еще не реализована ...
По сути, как уже указывал @invariant, разыменование всех классов, загружаемых конкретным загрузчиком классов, должно сделать этот загрузчик классов собираемым мусором. Однако есть (по крайней мере) одно исключение: если класс сериализован, на этот класс (и, следовательно, на его загрузчик классов) сохраняется внутренняя ссылка ObjectStreamClass
, который является первичным классом и поэтому никогда не собирается сборщиком мусора. Таким образом, в этом случае загрузчик классов не может быть обработан сборщиком мусора, пока не завершится работа всей JVM.
См. Полное объяснение здесь , в разделе «Проблемы, связанные со сборкой мусора и сериализацией».