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的弱引為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中文網其他相關文章!