首頁  >  文章  >  Java  >  java ThreadLocal記憶體洩漏如何解決

java ThreadLocal記憶體洩漏如何解決

王林
王林轉載
2023-05-18 10:25:051359瀏覽

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中的key其實是ThreadLocal的一個弱引用。

 正因為ThreadLocalMap以ThreadLocal的弱引為key,在這個ThreadLocal沒有外部強引用的時候,會被GC。這時候,ThreadLocalMap會出現一個key為null的Entry,理所當然的,這個Entry的value將永遠沒辦法被存取。

在這種情況下,如果當前工作線程一直沒有結束,那麼這個key為null的value因為被Entry強引用,而Entry被當前線程的ThreadLocalMap強引用,導致這個value永遠無法被GC ,造成內存洩漏。

2、解決方案

ThreadLocalMap的cleanSomeSlots(),expungeStaleEntry()方法都能清除key為null的value。在ThreadLocal的set(),get(),remove()方法中,都會呼叫cleanSomeSlots()或expungeStaleEntry()來清除ThreadLocalMap中所有key為null的value。

以上是java ThreadLocal記憶體洩漏如何解決的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除