5

URLClassLoaderを拡張するカスタムクラスローダーを使用しています。いくつかのクラスをカスタムクラスローダーにロードし、いくつかのタスクを実行します。タスクが完了したら、クラスローダーを破棄したいと思います。参照をnullに設定して、それを試してみました。

ただし、これはクラスローダーをガベージコレクションしません。

私が達成したいことを助けることができる方法はありますか?

4

5 に答える 5

3

基本的に、@invariant が既に指摘したように、特定のクラスローダーによってロードされたすべてのクラスを逆参照すると、そのクラスローダーのガベージ コレクションが可能になります。ただし、(少なくとも) 1 つの例外があります。クラスがシリアル化されている場合、そのクラス (およびそのクラスローダー) は によって内部的に参照されたままObjectStreamClassになります。したがって、この場合、JVM 全体が終了するまで、クラスローダをガベージ コレクションすることはできません。

詳細については、こちらの「ガベージ コレクションとシリアライゼーションに関連する問題」セクションを参照してください。

于 2010-03-31T11:05:16.013 に答える
2

ClassLoader docから: Every Class object contains a reference to the ClassLoader that defined it. これにより、ローダーの収集が妨げられています。クラスへのすべての参照とそれらのクラスのインスタンスも無効にする必要があります。

于 2010-03-31T10:56:06.590 に答える
1

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4950148に 6 年前のバグがあります。残念ながら、そのような機能はまだ実装されていないようです...

于 2010-03-31T10:57:47.937 に答える
1

ClassLoader によって作成されたクラスのインスタンスがなくなると、ClassLoader はガベージ コレクションされます。ClassLoader を明示的に破棄する方法がないことに関連する古いバグ ( 4950148 ) があり、ファイルのロックなどの問題が発生します。

これは、 URLClassLoader.close()メソッドを追加するJDK 7 で修正されました。

于 2010-12-11T23:06:01.003 に答える
0

このクラスローダーによってロードされたクラスのいずれかが参照されている限り、クラスローダーはガベージコレクションされません。したがって、次の場合、クラスローダーは削除されます。クラスローダーへのすべての直接参照がnullである場合、このクラスローダーによってロードされたクラスへのすべての参照、およびこれらのクラスのインスタンスへのすべての参照。その後、ガベージコレクターの次の実行時にダンプできます。

于 2010-03-31T11:15:24.533 に答える