2010-11-03 88 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以及可能的套接字連接。所以,重新加載會重複使用同一個類加載器,除非瀏覽器坐的時間足夠長,以便在連接處閒置一段時間,從而獲得一個新的套接字,從而創建一個新的類加載器。我們在同一頁面上有多個小程序,它們是否會在頁面重新加載後共享類加載器。

相關問題