Выгрузка DLL в Java - PullRequest
       4

Выгрузка DLL в Java

1 голос
/ 29 ноября 2010

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


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

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

1 Ответ

2 голосов
/ 29 ноября 2010

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

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

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

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

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

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

...