2010-07-29 39 views
3

我在我的應用程序中使用了一些外部即jar文件庫,不幸的是它本身並沒有正確清理,即第二次從這個庫創建一個對象時它不能按預期工作。我懷疑這是因爲庫創建了一些線程繼續運行,但我不確定。在外部Java庫後清理

有沒有辦法強制徹底清理外部庫創建的混亂?

+1

代碼!我們需要代碼! – 2010-07-29 18:25:25

+0

我可以提供一些代碼,但它非常特定於我正在使用的庫,這恰好是microemu。基本上,我在一個函數中從這個庫創建一個對象,使用它並從這個函數返回。下一次我調用這個函數(並創建這個對象,等等)它不會如預期的那樣工作 – Demiurg 2010-07-29 18:30:13

+2

您可能需要考慮實現某種嵌套類加載器,您可以實例化並訪問這些類,儘管如此,並且在完成時可能會被銷燬,也許OSGI 。 但是這可能會增加每次通話的開銷。 你不能擺脫圖書館或找到其他東西來取代它嗎? – crowne 2010-07-29 18:31:04

回答

1

可能有與線程無關的原因。例如,靜態類初始值設定項只在第一次加載類時運行一次。所以,這樣的事情可能是原因:

public class StupidSingleton { 
    private static StupidSingleton instance; 

    public StupidSingleton() { 
    if (instance == null) { 
     instance = this; 
    } else { 
     instance.foo(); // the implementation is irrelevant in this context 
    } 
    } 
} 

不管是什麼,有三種可用鹼性溶液:

  1. 不要使用jar。尋找更新和替代品。
  2. 使用自定義ClassLoader控制類加載。這是一條艱難的道路。
  3. 修復它。即使沒有源代碼,您也可以使用調試器並反編譯這些類。如果您找到原因並且無法獲得官方修復,那麼您仍可以從反編譯的類中創建proprietary_fixed.jar。