真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何探究ThreadLocal內(nèi)存泄漏的原因

本篇文章給大家分享的是有關(guān)如何探究ThreadLocal內(nèi)存泄漏的原因,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)建站-成都網(wǎng)站建設(shè)公司,專注做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站營銷推廣,域名與空間,網(wǎng)站空間,成都網(wǎng)站托管有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問題,請聯(lián)系創(chuàng)新互聯(lián)建站。

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

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

如何探究ThreadLocal內(nèi)存泄漏的原因

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

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

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

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

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

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

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

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

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

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

以下是源碼:

/**
 * 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> {
     /** The value associated with this ThreadLocal. */
     Object value;
     Entry(ThreadLocal k, Object v) {
     super(k);
     value = v;
     }
}

以上就是如何探究ThreadLocal內(nèi)存泄漏的原因,小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


分享文章:如何探究ThreadLocal內(nèi)存泄漏的原因
轉(zhuǎn)載來源:http://weahome.cn/article/gjogje.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部