ホームページ  >  記事  >  Java  >  Java ThreadLocal メモリ リークを解決する方法

Java ThreadLocal メモリ リークを解決する方法

王林
王林転載
2023-05-18 10:25:051344ブラウズ

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 を使用して ストレージを実装します。 Entry WeakReference クラスを継承するため、ThreadLocalMap のキーは実際には ThreadLocal への弱参照になります。

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 サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。