2017-06-03 5 views
0

我々の目的のために、jarをバンドルに組み込む標準のOSGI jarリファレンスは使用しませんでした。むしろオンラインでのアップグレードのために、アップグレード中に新しい、更新されたjarファイルを提供できるようにしたかったのです。バンドルを起動および停止するActivatorクラス内では、独自のURLClassLoaderを実装してから、サブフォルダ内のすべてのjarsを検索し、OSGI CLassLoaderを親としてURLClassLoaderに供給します。アプリケーションの管理者がjarをクラスパスに追加してアプリケーションを再起動するだけなので、これは素晴らしいことです(実際にはjvmをシャットダウンするのではなく、osgiを再起動してください)。私たちはこれを素晴らしい仕事にしました。私たちのbundle.jarは、すべてのjarリファレンスがバンドルjarに含まれていないため、時間の経過とともに膨大になりません。カスタム・クラス・ローダー・パーマネントを使用したOSGI

しかし、今では、同じJVM内でOSGIを使用してリモートからアプリケーションを再起動できるようになりました。しかし、再起動時に、追加したクラスローダーはガベージコレクションされません。したがって、10回のようにアプリケーションを再起動すると、Perm Gen(Java 1.7)がメモリ不足になります。

WebAppClassLoaderがアンロード時に実行するApacheの動作を模倣しようとしましたが、参照を削除しませんでした。

私はこれに対する解決策を探すためにインターネットを精査しており、標準的なOSGI実装の外側でコーディングしていますが、ClassLoaderへの参照をクリアする方法はありません。再起動後、正直に言及すべきではありません。

ヒットダンプの解析にMATを使用しましたが、参照されるクラスのリストは常に異なります。

外部ライブラリをOSGIで使用するためのより良い方法をロードする方法について知っていますか?

ありがとうございました!

+0

ではありません。その後、バンドルを何度も起動して停止し、すべてのクラスを参照するURLClassloaderの代わりにBundleWiringImpl $ BundleClassLoaderJava5は、バンドルを開始および停止するたびに参照を表示します。 – Dravenj

+1

クラスローダは、すべてのクラスに到達できない場合にのみガベージコレクションを取得できます。これは、これらのクラスのすべてのインスタンスに到達できないことを意味します。あなたがリークを持っているなら、それは問題ではありません。クラスローダー構造をどのように変更するのですか?リークを特定して修正するだけで、それを取り除くことができます。 – Holger

答えて

0

使用するJava 8、恒久的な世代は、だから我々はのURLClassLoaderを使用して削除しようとしただけでクラスのロードを管理するためにOSGIに完全に依存しているバージョン8

+0

Java 8で同じ問題が発生しました。メタスペースがJava 8のヒープ内で定義されているため、メモリ不足を生成するのに時間がかかります。 – Dravenj

関連する問題