在Java中卸载dll

时间:2010-11-29 19:14:31

标签: java multithreading dll java-native-interface

根据thisthis,似乎只有在对ClassLoader对象的引用消失且垃圾收集器运行时才会卸载dll。如果是这种情况,你可以简单地在一个线程中加载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 个答案:

答案 0 :(得分:2)

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

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

把它想象成意大利面 - 每一个参考都是一个意大利面条,只有整个球都是自由的,整个混乱都可以消失。

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

只有这样gc才能摆脱它(并且System.gc()不能保证它运行,它可能会在将来的某个时间运行)

实现起来真的很棘手 - 很多时候你最终会遇到内存泄漏,因为有一些被遗忘的小意大利面使整个球保持活力。

相关问题