<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ThreadLocal內(nèi)存泄漏真因探究

          共 1684字,需瀏覽 4分鐘

           ·

          2020-07-21 16:11

          閱讀文本大概需要3分鐘。

          1、首先看下ThreadLocal的原理圖:

          在ThreadLocal的生命周期中,都存在這些引用。

          306862a0616c1ede6a5177fe11bc464c.webp

          其中,實(shí)線代表強(qiáng)引用,虛線代表弱引用;

          2、ThreadLocal的實(shí)現(xiàn):每個(gè)Thread維護(hù)一個(gè)ThreadLocalMap映射表,這個(gè)映射表的key是ThreadLocal實(shí)例本身,value是真正需要存儲(chǔ)的Object;

          3、也就是說(shuō)ThreadLocal本身不存儲(chǔ)值,它只是作為一個(gè)key來(lái)讓線程從ThreadLocalMap獲取value,值得注意的是圖中的虛線,表示ThreadLocalMap是使用ThreadLocal的弱引用作為key,其在GC時(shí)會(huì)被回收;

          4、ThreadLocalMap使用ThreadLocal的弱引用作為key,如果一個(gè)ThreadLocal沒(méi)有外部強(qiáng)引用來(lái)引用它,那么系統(tǒng) GC 的時(shí)候,這個(gè)ThreadLocal勢(shì)必會(huì)被回收,這樣一來(lái),ThreadLocalMap中就會(huì)出現(xiàn)key為null的Entry,就沒(méi)有辦法訪問(wèn)這些key為null的Entry的value,如果當(dāng)前線程再遲遲不結(jié)束的話,這些key為null的Entry的value就會(huì)一直存在一條強(qiáng)引用鏈:Thread Ref -> Thread -> ThreaLocalMap -> Entry -> value永遠(yuǎn)無(wú)法回收,造成內(nèi)存泄漏。

          5、總的來(lái)說(shuō)就是,ThreadLocal里面使用了一個(gè)存在弱引用的map, map的類型是ThreadLocal.ThreadLocalMap. Map中的key為一個(gè)threadlocal實(shí)例。這個(gè)Map的確使用了弱引用,不過(guò)弱引用只是針對(duì)key。每個(gè)key都弱引用指向threadlocal。當(dāng)把threadlocal實(shí)例置為null以后,沒(méi)有任何強(qiáng)引用指向threadlocal實(shí)例,所以threadlocal將會(huì)被gc回收。

          但是,我們的value卻不能回收,而這塊value永遠(yuǎn)不會(huì)被訪問(wèn)到了,所以存在著內(nèi)存泄露。因?yàn)榇嬖谝粭l從current thread連接過(guò)來(lái)的強(qiáng)引用。只有當(dāng)前thread結(jié)束以后,current thread就不會(huì)存在棧中,強(qiáng)引用斷開(kāi),Current Thread、Map value將全部被GC回收。最好的做法是將調(diào)用threadlocal的remove方法,這也是等會(huì)后邊要說(shuō)的。

          6、其實(shí),ThreadLocalMap的設(shè)計(jì)中已經(jīng)考慮到這種情況,也加上了一些防護(hù)措施:在ThreadLocal的get(),set(),remove()的時(shí)候都會(huì)清除線程ThreadLocalMap里所有key為null的value。這一點(diǎn)在上一節(jié)中也講到過(guò)!

          7、但是這些被動(dòng)的預(yù)防措施并不能保證不會(huì)內(nèi)存泄漏:

          a、使用static的ThreadLocal,延長(zhǎng)ThreadLocal的生命周期,可能導(dǎo)致內(nèi)存泄漏;

          b、分配只用了ThreadLocal又不再調(diào)用get()、set()、remove()方法,那么可能導(dǎo)致內(nèi)存泄漏,因?yàn)檫@塊內(nèi)存會(huì)一直存在;

          以下是源碼:

          /**
          ?*?The?entries?in?this?hash?map?extend?WeakReference,?using
          ?*?its?main?ref?field?as?the?key?(which?is?always?a
          ?*?ThreadLocal?object).?Note?that?null?keys?(i.e.?entry.get()
          ?*?==?null)?mean?that?the?key?is?no?longer?referenced,?so?the
          ?*?entry?can?be?expunged?from?table.?Such?entries?are?referred?to
          ?*?as?"stale?entries"?in?the?code?that?follows.
          ?*/

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

          最后免費(fèi)給大家分享50個(gè)Java項(xiàng)目實(shí)戰(zhàn)資料,涵蓋入門、進(jìn)階各個(gè)階段學(xué)習(xí)內(nèi)容,可以說(shuō)非常全面了。大部分視頻還附帶源碼,學(xué)起來(lái)還不費(fèi)勁!


          附上截圖。(下面有下載方式)。

          7e5aae7c75b0eda6588bea8ca42139cb.webp

          e8e30620d4d099a759c4cb97a8dd7bd6.webp

          5768f7637f50600167c3f048bb98b91f.webp

          4c39342970ad4c658e06c8b9d8fb5ed2.webp

          816c86f80445ac48d7e07a1a048d6539.webp


          項(xiàng)目領(lǐng)取方式:

          掃描下方公眾號(hào)回復(fù):50

          可獲取下載鏈接

          ???

          ?長(zhǎng)按上方二維碼?2 秒回復(fù)「50」即可獲取資料

          點(diǎn)贊是最大的支持?92ccfe3ec292f3c841ec1398552c700e.webp

          瀏覽 44
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  性欧美7777777 亚洲成人无码免费观看 | 天天撸一撸免费视频 | 国产精品无人区 | 欧美午夜精品久久久久久蜜 | 台湾成人久久网站视频 |