<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    狂奔 lion

    自強不息

    關于ThreadLocal的內存泄露

    ThreadLocal是一種confinement,confinement和local及immutable都是線程安全的(如果JVM可信的話)。因為對每個線程和value之間存在hash表,而線程數量未知,從表象來看ThreadLocal會存在內存泄露,讀了代碼,發現實際上也可能會內存泄露。

    事實上每個Thread實例都具備一個ThreadLocal的map,以ThreadLocal Instance為key,以綁定的Object為Value。而這個map不是普通的map,它是在ThreadLocal中定義的,它和普通map的最大區別就是它的Entry是針對ThreadLocal弱引用的,即當外部ThreadLocal引用為空時,map就可以把ThreadLocal交給GC回收,從而得到一個null的key。

    這個threadlocal內部的map在Thread實例內部維護了ThreadLocal Instance和bind value之間的關系,這個map有threshold,當超過threshold時,map會首先檢查內部的ThreadLocal(前文說過,map是弱引用可以釋放)是否為null,如果存在null,那么釋放引用給gc,這樣保留了位置給新的線程。如果不存在slate threadlocal,那么double threshold。除此之外,還有兩個機會釋放掉已經廢棄的threadlocal占用的內存,一是當hash算法得到的table index剛好是一個null key的threadlocal時,直接用新的threadlocal替換掉已經廢棄的。另外每次在map中新建一個entry時(即沒有和用過的或未清理的entry命中時),會調用cleanSomeSlots來遍歷清理空間。此外,當Thread本身銷毀時,這個map也一定被銷毀了(map在Thread之內),這樣內部所有綁定到該線程的ThreadLocal的Object Value因為沒有引用繼續保持,所以被銷毀。

    從上可以看出Java已經充分考慮了時間和空間的權衡,但是因為置為null的threadlocal對應的Object Value無法及時回收。map只有到達threshold時或添加entry時才做檢查,不似gc是定時檢查,不過我們可以手工輪詢檢查,顯式調用map的remove方法,及時的清理廢棄的threadlocal內存。需要說明的是,只要不往不用的threadlocal中放入大量數據,問題不大,畢竟還有回收的機制。

    綜上,廢棄threadlocal占用的內存會在3中情況下清理:
    1 thread結束,那么與之相關的threadlocal value會被清理
    2 GC后,thread.threadlocals(map) threshold超過最大值時,會清理
    3 GC后,thread.threadlocals(map) 添加新的Entry時,hash算法沒有命中既有Entry時,會清理

    那么何時會“內存泄露”?當Thread長時間不結束,存在大量廢棄的ThreadLocal,而又不再添加新的ThreadLocal(或新添加的ThreadLocal恰好和一個廢棄ThreadLocal在map中命中)時。

     @2008 楊一. 版權所有. 保留所有權利

    posted on 2010-07-02 18:27 楊一 閱讀(2281) 評論(2)  編輯  收藏 所屬分類: Java SEOther Tech

    評論

    # re: 關于ThreadLocal的內存泄露[未登錄] 2010-07-03 09:32 m

    他的目的就是在thread的生命周期內維持變量。thread沒結束肯定不會掉呀~  回復  更多評論   

    # re: 關于ThreadLocal的內存泄露[未登錄] 2010-07-03 10:44 楊一

    @m
    那如果thread isdeamon呢,thread不同于普通的對象  回復  更多評論   

    <2010年7月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    公告

    本人在blogjava上發表的文章及隨筆除特別聲明外均為原創或翻譯,作品受知識產權法保護并被授權遵從 知識分享協議:署名-非商業性使用-相同方式共享 歡迎轉載,請在轉載時注明作者姓名(楊一)及出處(www.tkk7.com/yangyi)
    /////////////////////////////////////////
    我的訪問者

    常用鏈接

    留言簿(5)

    隨筆分類(55)

    隨筆檔案(55)

    相冊

    Java

    其他技術

    生活

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    自強不息


    用心 - 珍惜時間,勇于創造
    主站蜘蛛池模板: 最新亚洲成av人免费看| 亚欧乱色国产精品免费视频| 亚洲精品~无码抽插| 暖暖免费高清日本中文| 最近免费字幕中文大全视频| 久久精品无码专区免费| 亚洲а∨精品天堂在线| 亚洲成人网在线观看| 亚洲精品中文字幕无码蜜桃| 亚洲高清无码综合性爱视频| 免费观看的av毛片的网站| 亚洲精品国产免费| 久久综合国产乱子伦精品免费| 午夜成人无码福利免费视频| 亚洲高清毛片一区二区| 精品亚洲成在人线AV无码| 亚洲天天在线日亚洲洲精| 国产亚洲精品a在线观看app| 国产精品亚洲玖玖玖在线观看| 国产美女无遮挡免费视频网站| 18禁无遮挡无码网站免费| 2021国产精品成人免费视频| 日韩精品免费视频| 久久国产精品成人免费| 国产高清视频免费在线观看| 一个人免费观看视频在线中文| 无码毛片一区二区三区视频免费播放| 黄色免费网址在线观看| 视频一区二区三区免费观看| 久久亚洲AV成人无码国产电影| 色窝窝亚洲av网| 国产午夜亚洲精品不卡电影| 日韩在线视精品在亚洲| 亚洲AV无码国产一区二区三区| 亚洲另类自拍丝袜第五页| 亚洲欧美成人av在线观看| 亚洲av午夜国产精品无码中文字| 亚洲精品宾馆在线精品酒店| 亚洲国产精品日韩av不卡在线| 国产成人精品亚洲| jzzjzz免费观看大片免费|