代码之家  ›  专栏  ›  技术社区  ›  user489041

Java中卸载DLL

  •  1
  • user489041  · 技术社区  · 15 年前

    根据 this 和 this ,似乎只有当对ClassLoader对象的引用消失并且垃圾收集器运行时,才会卸载DLL。如果是这种情况,您是否可以简单地在一个线程中加载dll,然后终止该线程以实现相同的效果而不必创建自定义类加载器?像这样:

    
    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 回复  |  直到 15 年前
        1
  •  2
  •   Martin Algesten    15 年前

    不,那不行。DLL绑定到内存中具有本机接口的类对象。只要该类保留在内存中,DLL就不会卸载。

    这非常类似于可以重新加载类(作为开发的一部分)的servlet容器——每个Web上下文都有一个单独的类加载器(请看 tomcat's class loader documentation )

    把它想象成一个意大利面球——每一个参考都是一个意大利面,并且只有当整个球是自由的,整个混乱才能消失。

    删除对类加载器加载的任何类的对象的所有引用,最后删除对类加载器本身的引用。

    只有到那时,GC才能将其清除(和 System.gc() 不保证运行,将来可能运行)

    这真的很难做到——很多时候你都会因为记忆泄露而失败,因为有一些被遗忘的意大利面可以让整个球保持活力。