我有一个关于为什么会出现以下问题的理论,但我找不到任何文档以某种方式证明我的理论,所以我需要一些建议。
我有一个(签名的)小程序,它加载一个 DLL。现在,上周五我点击了“刷新”,小程序重新加载正常,包括显然重新加载 DLL。但是今天,点击“刷新”会导致以下异常:
java.lang.UnsatisfiedLinkError: Native Library XXX already loaded in another classloader
根据 Javadoc (Java 6) System.loadLibrary 是 Runtime.loadLibrary 的便捷方法,根据该文档:
If this method is called more than once with the same library name, the second and subsequent calls are ignored.
我知道并理解您不能在同一个 JVM 中的不同类加载器中加载同一个 native 库,这解释了上述异常。我想证明的是为什么它似乎在某一天起作用,但现在却不起作用。特别是考虑到 DLL 加载周围没有任何代码更改。
所以我的假设是这样的;
- 上面的文档应该写成“忽略同一个类加载器中的第二次和后续调用”
- 上周五,行星的排列方式不同,因此当我点击刷新时,浏览器使用了不同的 JVM(或者可能是同一个类加载器?),因此 DLL 已正确加载并且运行良好。<
- 今天行星的排列方式不同,浏览器重用相同的 JVM 但使用不同的类加载器,这解释了为什么我现在收到此错误。
顺便说一句,有问题的浏览器是 IE7,我运行的是 Java 1.6。我不认为浏览器版本特别重要,因为据我所知,浏览器决定如何处理 applet 完全取决于浏览器实现者。
这些假设是否合理且正确?我可能错过了什么?
非常感谢。
最佳答案
听起来像这样Problem : Native Library already loaded in another classloader
现在他们谈论的是 servlet,而不是 applet,但许多相同的行为都适用。
浏览器将类加载器绑定(bind)到 url 和可能的套接字连接。因此,重新加载将重用相同的类加载器,除非浏览器等待足够长的时间以闲置连接,此时您将获得一个新的套接字,从而获得一个新的类加载器。我们在同一个页面上有多个小程序,在重新加载页面后他们是否会共享一个类加载器是一个废话。
关于java - 在浏览器中的 Applet 中重新加载 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4088487/