1. リーク インスタンス
ThreadLocalMap の静的内部クラス Entry:
static class Entry extends WeakReference<ThreadLocal<?>> { /** The value associated with this ThreadLocal. */ Object value; Entry(ThreadLocal<?> k, Object v) { super(k); value = v; } }
ThreadLocalMap は静的内部クラス Entry を使用して
ThreadLocalMap は ThreadLocal の弱参照をキーとして使用するため、この ThreadLocal に外部強参照がない場合は GC になります。このとき、ThreadLocalMapにはnullキーを持つEntryが出現しますが、当然ながらこのEntryの値にアクセスされることはありません。
この場合、現在の作業スレッドが終了していない場合、null キーを持つ値は Entry によって強く参照され、Entry は現在のスレッドの ThreadLocalMap によって強く参照されるため、この値は決して得られません。 GC が可能であり、メモリ リークが発生します。
2. 解決策
ThreadLocalMap の cleanSomeSlots() メソッドと expungeStaleEntry() メソッドは、null キーを含む値をクリアできます。 ThreadLocal の set()、get()、remove() メソッドでは、cleanSomeSlots() または expungeStaleEntry() が呼び出され、ThreadLocalMap 内の null キーを持つすべての値がクリアされます。
以上がJava ThreadLocal メモリ リークを解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。