2010-11-29 2 views
1

В соответствии с this и this, похоже, что dll выгружается только тогда, когда ссылка на объект ClassLoader отсутствует и запущен сборщик мусора. Если это так, можете ли вы просто загрузить DLL в поток, а затем убить поток, чтобы добиться такого же эффекта, не создавая собственный ClassLoader? Что-то вроде этого:Выгрузка dll в Java

 

new Thread(
    new Runnable() 
    { 
     public void run() 
     { 
      System.load("dll"); 
     } 
    } 
).start(); //Will load the dll, then there will be no references to the thread 

System.gc(); //Will unload the dll 
 

я бы, вероятно, сделать что-то более сложное, чем это в реальной обстановке жизни, но только, чтобы показать точку.

+0

Примечание: `System.gc();` не будет напрямую заставлять коллекцию garbare, это больше похоже на «пожалуйста, запустите сборку мусора в ближайшем будущем, если вы в настроении» – thejh 2010-11-29 19:20:49

+2

«О могучий В.М. Я смиренно с большим уважением обращайтесь к вам, возможно, по возможности, в любое удобное для вас время, без давления, подумайте в своей бесконечной мудрости, чтобы запустить мусор, пожалуйста, с сахаром сверху ». – 2010-11-29 20:09:54

ответ

2

Нет. Это не сработает. Dll привязан к объекту класса, который у вас есть в памяти, с собственным интерфейсом. Пока этот класс остается в памяти, dll не выгружается.

Это очень похоже на контейнер сервлетов, который может перезагружать классы (как часть разработки) - у них всегда есть отдельный загрузчик классов для каждого контекста (смотрите tomcat's class loader documentation).

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

Оставьте все ссылки на объекты любого класса, загруженные загрузчиком классов, и, наконец, ссылку на загрузчик классов.

Только тогда дс избавиться от него (и System.gc() не гарантирует, что работает, он может работать когда-нибудь в будущем)

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

Смежные вопросы