2010-11-29 10 views
1

thisthisによると、ClassLoaderオブジェクトへの参照がなくなりガベージコレクタが実行されると、dllはアンロードされたように見えます。この場合、スレッドでdllをロードしてから、カスタムClassLoaderを作成せずに同じ効果を得るためにスレッドを終了できますか?このような何か:Javaでdllをアンロード

 

new Thread(
    new Runnable() 
    { 
     public void run() 
     { 
      System.load("dll"); 
     } 
    } 
).start(); //Will load the dll, then there will be no references to the thread 

System.gc(); //Will unload the dll 
 

私はおそらく現実の設定でこれ以上の精巧な何かをするだろうが、ちょうどポイントを表示します。

+0

Note: 'System.gc();'はガーベアコレクションを直接強制しません。もっと気楽にガーベジコレクションを実行してください。 – thejh

+2

"謙虚なVMです。可能であれば、いつでもあなたに都合のいいこと、圧力をかけないこと、あなたの無限の知恵の中で、ゴミ収集を実行することを考えてください。 –

答えて

2

いいえ、動作しません。 dllは、ネイティブインタフェースを使用してメモリ内にあるクラスオブジェクトにバインドされます。そのクラスがメモリに残っている限り、DLLはアンロードされません。

これは、(開発の一部として)クラスをリロードできるサーブレットコンテナによく似ています。ウェブコンテキストごとに別々のクラスローダーを常に持っています(tomcat's class loader documentation参照)。

スパゲッティのボールと考える - すべての参照はスパゲッティで、ボール全体がフリーである場合に限り、すべての混乱は消え去ります。

クラスローダーがロードしたクラスのオブジェクトへの参照をすべて削除し、最後にクラスローダー自体への参照を削除します。

だけにして、GCはそれを取り除くだろう(とSystem.gc()は、それが将来的に実行することがあり、それが実行される保証するものではありません)

これを達成するのは本当に難しいことができます - あなたはメモリで終わる何回も全体のボールを生きている状態に保つ小さな忘れられたスパゲッティがあるので、リークします。

+0

ええと、これは面白いです。私はその場でdllをロードしたりアンロードしたりできるようにする必要があります。私は2つのDLLがあると言うことができます。 1つは「ローダー」と呼ばれ、もう1つは「関数」と呼ばれます。 "loader" dllの唯一の目的は、 "関数" dllをロードしてアンロードすることです(javaで行う必要はありません)。 "function" dllは私が必要とするすべての機能を提供します。 「関数」dllを「loader」dllでロードすると、以前と同じように、関数dllでネイティブ関数にアクセスできるようになりますか?これは混乱している場合はごめんなさい。または、dllを読み込んでロードするための提案がありますか? – user489041

+0

私はあなたが説明するようにそれを行うことができると思います。 Java <->ローダー<->機能。ローダは事実上単なるインタフェースであり、関数への実際のメソッド呼び出しをプロキシしているので、関数は決してjavaと直接接触しません。そうすれば、関数がロードされたときにC/C++/whatevaを制御することができます。これは面白いです、私たちはそれがどのように動作するか教えてください! –

+0

@ user489041:解決策は見つかりましたか?私は非常に知りたいです.. :) –

関連する問題