首頁 > Java > java教程 > 主體

java ThreadLocal記憶體洩漏如何解決

王林
發布: 2023-05-18 10:25:05
轉載
1350 人瀏覽過

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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板