ホームページ > Java > &#&チュートリアル > Java ThreadLocal メモリ リークを解決する方法

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

王林
リリース: 2023-05-18 10:25:05
転載
1366 人が閲覧しました

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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート