一、ThreadLocal結構
一個Thread中存在字段為ThreadLocalMap
ThreadLocal.ThreadLocalMap threadLocals = null;
也就是說我們使用threadLocal進行set操作和get操作,其實就是操作該Thread的threadLocalMap。
這個map是一個基于數組的key和value的格式,在進行get的時候,會將調用對象this作為key進行查詢。
二、ThreadLocalMap解決下標沖突
hashMap是通過鏈表法,threadLocalMap是通過開放尋址法,也就是通過key進行求余下標得到元素,判斷是否全等,如果是則返回,如果不是,則再次尋址,也就是下標+1,繼續(xù)判斷是否全等,直到找到。
三、ThreadLocal內存溢出問題
在ThreadLocalMap中的Entry對象的key是弱引用。
這樣能保證在線程結束的時候,可以將key進行回收。
但是如果線程一直沒有結束,那么就會導致threadLocal的key和value一直綁定到thread中,但是又沒有用到這個對象。
- 線程一直執(zhí)行
- 大量的threadLocal對象
- 對應的threadLocal對象的value過大
那么為什么會存在線程一直執(zhí)行呢? 那就是線程池,核心線程數會一直開啟,并且如果核心線程在使用前里的threadLocals也應該清空。文章來源:http://www.zghlxwxcb.cn/news/detail-437603.html
四、總結
在使用threadLocal之后,需要使用remove進行移除即可。文章來源地址http://www.zghlxwxcb.cn/news/detail-437603.html
到了這里,關于ThreadLocal-為什么會導致內存泄漏的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!