2

こちらのリンクで

クラスローダ使用時のメモリリークについて説明しています。今このコメント:

クラスローダーは、他に何も参照されていない場合にのみ、ガベージ コレクターによって削除されます。すべてのクラスはクラスローダーへの参照を保持し、すべてのオブジェクトはクラスへの参照を保持します。その結果、アプリケーションがアンロードされても、そのオブジェクトの 1 つがまだ保持されている場合 (たとえば、キャッシュまたはスレッドローカル変数によって)、基になるクラスローダーをガベージ コレクターで削除することはできません!

なんとなくわかります。しかし、彼らが言う部分では:

(例: キャッシュまたはスレッドローカル変数による)

キャッシュとは静的参照を意味し、スレッドローカルとは非静的スレッドローカル変数を意味すると言っても過言ではありません。これは、スレッドローカル メモリ リークのすべてのコード説明で、スレッドローカル変数が静的になるためです。たとえば、SOのこの質問

キャッシュに関するコメントに関する私のもう 1 つの質問は、アプリケーションがダウンしたときに静的変数が GC されるのに、なぜこれが問題になるのでしょうか?

4

1 に答える 1

1

各スレッドには (事実上) WeakHashMap があり、Data は何らかのオブジェクトであり、オブジェクトは Class を参照し、Class は ClassLoader を参照し、ClassLoader はロードしたすべてのクラス (ThreadLocalHolder など) を参照し、ThreadLocalHolder クラスには静的なThreadLocal を保持しているため、WeakHashMap 値はキーを参照し、Thread オブジェクト全体がなくなるまでキー + 値が収集されないようにします。より詳細な説明と例については、私のこの回答を参照してください。

于 2013-09-07T05:54:28.397 に答える