2016-08-28 29 views
2

私はいくつかのサードパーティ製のソースコードを使用していますが、これはGUIで実行することを目的としていますが、GUIを使用せずに統合しており、使用しているサードパーティのコードから重大なメモリリーク。ですから、サードパーティアプリケーションインスタンスのオブジェクトを何らかの形でサンドボックスのように作成して、後でオブジェクトを削除し、そのコードが呼び出すオブジェクトへの参照をすべて削除することができれば、私は疑問に思っています。ガベージコレクタJavaを使用して「サンドボックス」モードでライブラリを実行するにはどうすればよいですか?

可能なことはありますか?同様のシナリオを達成するための代替手段は何ですか?唯一の可能性はjava -jar customApp ...のようなプロセスビルダーから他のアプリケーションを呼び出すことです。それは少し醜いですが...

EDIT: このコードを別のスレッドで実行し、スレッドが完了するのを待つと、ガベージコレクタがそこに呼び出されたものに関連するすべてのオブジェクトを削除しますか?

+0

あなたは自分のオブジェクトにそのネイティブコードを確実にラップすることができますが、メモリが漏れてしまうことはありません。 GCには、ネイティブコードによって割り当てられたメモリを処理する方法がありません。 – duffymo

+0

これは現時点では信頼できるとは思わない。クラスオブジェクトもアンロードすることができなければなりません.JVMがすべての状況でそれを行うことはできません。メモリリークのないライブラリを見つけるのに最適です。 (また、Javaライブラリではなくネイティブライブラリを意味する場合は、すべてのベットは間違いなく行われます)。 – markspace

答えて

1

まず、メモリプロファイラ(yourkitなど)でメモリ使用状況を実際に調査し、メモリ消費の理由を完全に理解するまで、それを成功させることはまずありません。

第2に、Javaではなくネイティブであれば、メモリが問題になりますが、何もできません。

次のような場合があります。

問題のあるライブラリを独自のクラスローダーにロードし、メインクラスローダーでロードした非常に狭いインターフェースでのみ参照し、特殊クラスローダーに継承します。これにより、ライブラリ内で作成されたオブジェクトへの参照が保持されることは非常に困難になりますが、不可能ではありません。ライブラリがスレッドを作成し、参照をThreadLocalオブジェクトに入れた場合、スレッドを強制終了させない限り、開始した場所に戻ります。それでも、ライブラリが静的な参照でたくさんのオブジェクトを積み重ねるなら、これは役に立たないでしょう。

関連する問題