日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

收不回来的value

發布時間:2024/4/13 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 收不回来的value 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ThreadLocal注意點

內存泄漏問題

內存泄漏:某個對象不再有用,但是占用的內存確不能被回收。

Key的泄漏
ThreadLocalMap中的Entry繼承自WeakReference,是弱引用,弱引用的特點是,如果這個對象只被弱引用關聯(沒有任何強引用關聯),那么在下一次垃圾回收的時候必然會被清理掉。?

static class Entry extends WeakReference<ThreadLocal<?>> {/** The value associated with this ThreadLocal. */Object value;Entry(ThreadLocal<?> k, Object v) {super(k);value = v;} }

Value的泄漏

  • ThreadLocalMap的每個Entry都是一個對Key的弱引用,同時每個Entry都包含了一個對Value的強引用
  • 正常情況下,當線程終止,保存在ThreadLocal里的Value會被垃圾回收,因為沒有任何強引用關聯
  • 但是,如果線程始終不終止(比如線程需要保持很久或者使用線程池的時候),那么Key對應的Value就不能被回收,因為有以下的調用鏈:

  • 因為Value和Thread之間還存在這個強引用調用鏈,所以導致value無法被回收,就可會出現OOM
  • JDK已經考慮到了這個問題,所以在set()、remove()、rehash()方法中會掃描key為null的Entry,并把對應的value設置為null,這樣value對象就可以被回收
  • 但是如果一個ThreadLocal不被使用,那么實際上set()、remove()、rehash()等方法也不會被調用,并且線程又不停止,那么調用鏈就一直存在,那么也就導致了value的內存泄漏

如何避免內存泄漏(阿里代碼規約)

  • 調用remove()方法,就會刪除對應的Entry對象,可以避免內存泄漏,所以使用完ThreadLocal之后,應該調用remove()方法
  • 如果使用攔截器獲取用戶信息,那么同樣應該使用攔截器在線程請求退出之前將之前保存過得信息清除掉

?

ThreadLocal引用對象存在兩處:ThreadLocal tl = new ThreadLocal;? ?ThreadMap

ThreadMap跟著Thread,Thread如果在線程池中,則不會銷毀棧中的引用對象;

所以ThreadLocal對象存在內存泄漏的情況,Map中設計成弱引用則可避免,但未解決value的內存泄漏(1)

jdk在ThreadLocal的get(),set(),remove()的時候都會清除線程ThreadLocalMap里所有key為null的value。(注意,是使之失效,下次gc時回收)但仍存在階段的泄漏風險(2)

故最佳實踐:每次使用完ThreadLocal,都調用它的remove()方法,

(1)避免key的泄漏

(2)避免value的泄漏

可以看到jdk設計是比較嚴謹安全的,假定程序員set完了不會remove(如果ThreadLocal ref修飾為static,則必須remove?ThreadLocal為什么要設計成private static?)

前言

ThreadLocal?的作用是提供線程內的局部變量,這種變量在線程的生命周期內起作用,減少同一個線程內多個函數或者組件之間一些公共變量的傳遞的復雜度。但是如果濫用?ThreadLocal,就可能會導致內存泄漏。下面,我們將圍繞三個方面來分析?ThreadLocal?內存泄漏的問題

  • ThreadLocal?實現原理
  • ThreadLocal為什么會內存泄漏
  • ThreadLocal?最佳實踐

ThreadLocal 實現原理

?

ThreadLocal的實現是這樣的:每個Thread?維護一個?ThreadLocalMap?映射表,這個映射表的?key?是?ThreadLocal?實例本身,value?是真正需要存儲的Object。

也就是說?ThreadLocal?本身并不存儲值,它只是作為一個?key?來讓線程從?ThreadLocalMap?獲取?value。值得注意的是圖中的虛線,表示ThreadLocalMap?是使用?ThreadLocal?的弱引用作為?Key?的,弱引用的對象在 GC 時會被回收。

ThreadLocal為什么會內存泄漏

ThreadLocalMap使用ThreadLocal的弱引用作為key,如果一個ThreadLocal沒有外部強引用來引用它,那么系統 GC 的時候,這個ThreadLocal勢必會被回收,這樣一來,ThreadLocalMap中就會出現key為null的Entry,就沒有辦法訪問這些key為null的Entry的value,如果當前線程再遲遲不結束的話,這些key為null的Entry的value就會一直存在一條強引用鏈:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永遠無法回收,造成內存泄漏。

其實,ThreadLocalMap的設計中已經考慮到這種情況,也加上了一些防護措施:在ThreadLocal的get(),set(),remove()的時候都會清除線程ThreadLocalMap里所有key為null的value。

但是這些被動的預防措施并不能保證不會內存泄漏:

  • 使用線程池的時候,這個線程執行任務結束,ThreadLocal對象被回收了,線程放回線程池中不銷毀,1?這個線程一直不被使用,導致內存泄漏
  • 2 分配使用了ThreadLocal又不再調用get(),set(),remove()方法,那么這個期間就會發生內存泄漏

為什么使用弱引用

從表面上看內存泄漏的根源在于使用了弱引用。網上的文章大多著重分析為什么會內存泄漏,但是另一個問題也同樣值得思考:為什么使用弱引用?為什么不用強引用?

static?class?Entry?extends?WeakReference<ThreadLocal>

我們先來看看官方文檔的說法:

To help deal with very large and long-lived usages, the hash table entries use WeakReferences for keys.
為了應對非常大和長時間的用途,哈希表使用弱引用的 key。

下面我們分兩種情況討論:

  • key 使用強引用:引用的ThreadLocal的對象被回收了,但是ThreadLocalMap還持有ThreadLocal的強引用,如果沒有手動刪除,ThreadLocal不會被回收,導致Entry內存泄漏。
  • key 使用弱引用:引用的ThreadLocal的對象被回收了,由于ThreadLocalMap持有ThreadLocal的弱引用,即使沒有手動刪除,ThreadLocal也會被回收。value在下一次ThreadLocalMap調用set,get的時候會被清除。

比較兩種情況,我們可以發現:由于ThreadLocalMap的生命周期跟Thread一樣長,如果都沒有手動刪除對應key,都會導致內存泄漏,但是使用弱引用可以多一層保障:弱引用ThreadLocal不會內存泄漏,對應的value在下一次ThreadLocalMap調用set,get,remove的時候會被清除。

因此,ThreadLocal內存泄漏的根源是:由于ThreadLocalMap的生命周期跟Thread一樣長,如果沒有手動刪除對應key就會導致內存泄漏,而不是因為弱引用。

ThreadLocal 最佳實踐

綜合上面的分析,我們可以理解ThreadLocal內存泄漏的前因后果,那么怎么避免內存泄漏呢?

  • 每次使用完ThreadLocal,都調用它的remove()方法,清除數據。

在使用線程池的情況下,沒有及時清理ThreadLocal,不僅是內存泄漏的問題,更嚴重的是可能導致業務邏輯出現問題。所以,使用ThreadLocal就跟加鎖完要解鎖一樣,用完就清理。

?

總結

以上是生活随笔為你收集整理的收不回来的value的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 5月婷婷6月丁香 | 一道本在线播放 | 久久亚洲精品国产精品黑人v | 中文字幕乱码一二三区 | 黄色网av| 九九免费精品视频 | 亚洲色诱 | 国产一区精品视频 | 性农村xxxxx小树林 | 少妇中出视频 | 亚洲一区二区日本 | 一级国产片 | 老汉av在线 | 看免费一级片 | 日韩精品一区在线观看 | 午夜视频久久 | 国产精品高清网站 | 国产精品第二页 | 人禽高h交| 大尺度叫床戏做爰视频 | 妺妺窝人体色www聚色窝仙踪 | 欧美丰满熟妇bbbbbb百度 | 欧美日韩国产专区 | 日本毛片网站 | 毛片网站在线播放 | 免费看黄20分钟 | 国产精品久久久久久久天堂 | 日韩一级视频在线观看 | 国产区一区二 | 黄色短视频在线播放 | 成人深夜福利在线观看 | 国产精品久久 | 国产一国产二 | 奇米影视大全 | 91久久影院 | xxxxx国产| 99热这里有 | 午夜小视频在线播放 | 亚洲熟女一区二区三区 | 日日夜夜精品视频 | 欧美日韩一区三区 | 国产91在线观看丝袜 | 影院色原网站 | 中文字幕网伦射乱中文 | 成人免费视 | 国产精品久久久久9999爆乳 | 国产欧美日韩另类 | 青娱乐超碰在线 | 青青草这里只有精品 | 精品人妻一区二区三区三区四区 | 日韩免费高清一区二区 | 日日摸天天爽天天爽视频 | 国产91成人| 中国一级黄色 | 色婷婷视频网 | 免费吸乳羞羞网站视频 | 午夜高清 | 亚洲天堂av一区二区 | 亚洲一区二区三区 | 久久婷婷五月综合 | 欧美黑人精品一区二区 | 国产调教在线 | 国产精品成人免费一区久久羞羞 | 久久看片网 | 午夜特片网 | 日韩精品第1页 | 在线看国产视频 | 国产精品夜夜 | 蜜桃视频欧美 | av大片免费看 | 一二三四国产精品 | 日韩欧美一区二区在线 | a级片中文字幕 | 亚洲涩涩在线 | 爱插网 | 在线观看h视频 | 催眠调教后宫乱淫校园 | 色综合五月 | 亚洲国产成人自拍 | 亚洲三级久久 | 久91 | 无码人妻久久一区二区三区蜜桃 | 91久久精品一区二区三区 | www.亚洲免费 | 狠狠搞狠狠干 | 日韩欧美在线视频免费观看 | 亚洲AV无码成人精品区先锋 | 欧美精品久久久久久久自慰 | 亚洲永久精品国产 | 亚洲日本三级 | 中文字幕在线有码 | 国产无码日韩精品 | 国产高清露脸 | 久久欧洲 | 午夜精品电影 | 色哟哟免费视频 | 黄色观看网站 | 国产乡下妇女做爰视频 | 欧美激情区|