2017-06-03 28 views
0

對於我們的目的,我們沒有與構建罐子成捆的標準OSGI罐子參考去。而不是在線升級,我們希望能夠在升級期間提供新的和更新的罐子。在我們的啓動和停止包的Activator類中,我們實現自己的URLClassLoader,然後查找子文件夾中的所有jar,並將OSGI CLassLoader作爲父級提供給URLClassLoader。這很棒,因爲現在應用程序的管理員可以簡單地將jar添加到類路徑並重新啓動應用程序(osgi restart,而不是實際關閉jvm)。我們做得很好。加上我們的bundle.jar並沒有隨着時間的推移而變得龐大,因爲所有的jar引用都不包含在bundle jar中。OSGI使用自定義類裝載器燙髮根問題

然而,現在我們必須使用OSGi在同一個JVM內做遠程重新啓動應用程序的能力。但是,當重啓發生時,我們添加的類加載器從不會被垃圾收集。所以如果你重新啓動應用程序10次,那麼它會讓Perm Gen內存不足(Java 1.7)。

我們試圖模仿做什麼阿帕奇WebAppClassLoader上卸載但這並不要麼刪除引用。

我已經走遍瞭解決方案,互聯網,這並授予我們的編碼典型的OSGi實現然而外面是不是有辦法清除的類加載器的引用。重新啓動後,誠實地不應該有任何引用。

我們已經使用MAT分析堆轉儲,但類的引用列表始終是不同的。

任何人都知道的一種方式來加載外部庫OSGI內使用更好的方法?

感謝您的任何信息!

+0

沒有永久的一代所以我們嘗試使用URLClassLoader的刪除,只是完全依靠OSGI來管理類加載。然後,我們通過多次啓動和停止bundle來測試這一點,現在不是通過URLClassloader引用所有的類,BundleWiringImpl $ BundleClassLoaderJava5仍然顯示每次啓動和停止bundle時的引用。 – Dravenj

+1

類加載器只能獲取垃圾回收,如果其所有類都無法訪問,這意味着這些類的所有實例都無法訪問。如果你有泄漏,這並不重要,你如何改變類加載器結構,你只能通過識別泄漏並修復它來擺脫它。 – Holger

回答

0

使用的Java 8中,在版本8

+0

我們遇到了與Java 8相同的問題。生成內存不足需要花費更長的時間,因爲元數據空間是在Java 8的堆中定義的。 – Dravenj