2010-11-03 36 views
2

我有一个理论,为什么我有以下问题,但我找不到任何证明我的理论的文档,所以我想要一些建议。重新加载DLL中的Applet在浏览器中

我有一个加载DLL的(签名)小程序。现在,上个星期五我点击“刷新”,小程序正在重新加载,包括显然重新加载DLL。但今天,打“刷新”导致以下异常:

java.lang.UnsatisfiedLinkError: Native Library XXX already loaded in another classloader 

根据的Javadoc(Java 6中)的System.loadLibrary是Runtime.loadLibrary的便捷方法,并根据该文件:

如果使用相同的库名称多次调用此方法,则会忽略第二个和后续调用。

我知道并理解您无法在同一个JVM中的不同类加载器中加载相同的本机库,这解释了上述异常。我试图证明的是为什么它似乎在某一天工作,但现在不行。特别是考虑到在DLL加载周围没有任何代码改变。

所以我的假设是这样的;

  1. 上述文件应为“第二次和后续调用在相同的类加载器*被忽略
  2. 上周五*,行星是在一个不同的排列,因此在浏览器中使用不同的JVM是(或也许是相同的类加载器?)当我刷新时,所以DLL被正确加载和事情很好地运作。
  3. 今天行星排列不同,浏览器重复使用相同的JVM,但不同的类加载器,这解释了为什么我现在得到这个错误

顺便说一下,有问题的浏览器是IE7,我正在运行Java 1.6。我不认为浏览器版本特别重要,因为我的理解是,浏览器决定使用applet是完全由浏览器实施者决定的。

这些假设看起来是否合理和正确?我可能错过了什么?

非常感谢提前。

回答

1

这听起来像这样Problem : Native Library already loaded in another classloader

现在他们正在谈论的servlet,而不是小程序,但许多相同的行为适用。

浏览器将类加载器绑定到url以及可能的套接字连接。所以,重新加载会重复使用同一个类加载器,除非浏览器坐的时间足够长,以便在连接处闲置一段时间,从而获得一个新的套接字,从而创建一个新的类加载器。我们在同一页面上有多个小程序,它们是否会在页面重新加载后共享类加载器。

相关问题