




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第ThreadLocal導(dǎo)致JVM內(nèi)存泄漏原因探究為什么要使用ThreadLocal
在一整個(gè)業(yè)務(wù)邏輯流程中,為了在不同的地方或者不同的方法中使用同一個(gè)對(duì)象,但是又不想在方法形參中加這個(gè)對(duì)象,那么就可以使用ThreadLocal來(lái)保存
ThreadLocal最大的應(yīng)用場(chǎng)景就是跨方法進(jìn)行參數(shù)傳遞
ThreadLocal可以給每一個(gè)線程綁定一個(gè)變量的副本
使用ThreadLocal
ThreadLocal常用的方法其實(shí)也就下面幾個(gè)
//返回當(dāng)前線程所對(duì)應(yīng)的線程局部變量。
publicTget(){}
//設(shè)置當(dāng)前線程的線程局部變量的值。
publicvoidset(Tvalue){}
//移除,當(dāng)線程結(jié)束后,該線程thread對(duì)象中的局部變量將在下一次gc時(shí)回收,如果顯示的調(diào)用此方法只是可以加快內(nèi)存回收的速度
//所以javase開發(fā)普通newThread()方式中,這個(gè)方法并不是必須要調(diào)用的
//但是javaWeb開發(fā)中就必須顯示調(diào)用,因?yàn)閖avaweb都是使用的線程池,并不是一個(gè)客戶端來(lái)一個(gè)請(qǐng)求,thread線程對(duì)象用完就刪除,而是會(huì)放回線程池中。
publicvoidremove(){}
//返回該線程局部變量的一個(gè)初始化
//protected方法,顯然是為了讓子類覆蓋而設(shè)計(jì)的。這個(gè)方法在第一次調(diào)用get()或set(Object)時(shí)才執(zhí)行,并且僅執(zhí)行1次
protectedTinitialValue(){}
在具體使用的時(shí)候,我們ThreadLocal對(duì)象一定會(huì)定義成靜態(tài)的,如果不定義成靜態(tài)的那么其他地方如何通過(guò)這個(gè)ThreadLocal實(shí)例去Map中拿數(shù)據(jù)嘞?
而且如果是多個(gè)線程保存一個(gè)變量的副本,一個(gè)靜態(tài)的ThreadLocal也足夠了,因?yàn)樗亲鳛槎鄠€(gè)map中的key存在的
簡(jiǎn)單使用案例
*@Description:在一個(gè)方法中調(diào)用set()方法存值,在另一個(gè)方法中調(diào)用get()方法取值
publicclassUseThreadLocalTest{
publicstaticThreadLocalStringthreadLocal=newThreadLocal();
*創(chuàng)建一個(gè)線程類
publicstaticclassThreadTestextendsThread{
privateIntegerid;
ThreadTest(Integerid){
this.id=id;
@Override
publicvoidrun(){
threadLocal.set(Thread.currentThread().getName()+:+id);
print();
publicvoidprint(){
System.out.println(threadLocal.get());
*開三個(gè)線程
publicstaticvoidmain(String[]args){
for(inti=0;ii++){
newThreadTest(i).start();
//輸入結(jié)果如下
Thread-0:0
Thread-1:1
Thread-2:2
ThreadLocal底層set()和get()方法的源碼如下
//存值時(shí)map最終是存儲(chǔ)在當(dāng)前線程Threadt=Thread.currentThread()中的,是thread的一個(gè)成員變量
//map的key是當(dāng)前threadLocal對(duì)象實(shí)例,value是要存的值
publicvoidset(Tvalue){
Threadt=Thread.currentThread();
ThreadLocalMapmap=getMap(t);
if(map!=null)
map.set(this,value);
else
createMap(t,value);
//取值時(shí)也是也是先從當(dāng)前線程Thread對(duì)象中取出map
//然后在從map中根據(jù)當(dāng)前threadLocal對(duì)象實(shí)例作為key獲取到entry對(duì)象
publicTget(){
Threadt=Thread.currentThread();
ThreadLocalMapmap=getMap(t);
if(map!=null){
ThreadLocalMap.Entrye=map.getEntry(this);
if(e!=null){
@SuppressWarnings(unchecked)
Tresult=(T)e.value;
returnresult;
returnsetInitialValue();
為了提高性能,才沒有采用加鎖的方式,而是將map和各個(gè)線程thread對(duì)象進(jìn)行關(guān)聯(lián),這樣就避免了產(chǎn)生線程安全問題,也避免了加鎖,提高了性能
我們接下來(lái)再來(lái)看看ThreadLocalMap它的實(shí)現(xiàn),它類似于jdk1.7版本的hashmap,底層存儲(chǔ)的是一個(gè)Entry對(duì)象的數(shù)組,初始容量也是16,存值時(shí)先用hash結(jié)果和數(shù)組長(zhǎng)度取余得到數(shù)組下標(biāo)位置,然后判斷是否產(chǎn)生了hash沖突,然后使用開發(fā)定址法來(lái)處理。根據(jù)算法的不同又可以分為線性探測(cè)再散列、二次探測(cè)再散列、偽隨機(jī)探測(cè)再散列。ThreadLocalMap它是使用的線性探測(cè)再散列法,如下所示
privatestaticintnextIndex(inti,intlen){
return((i+1len)i+1:0);
Entry對(duì)象中的key它是一個(gè)弱引用,Entry繼承了WeakReference類,弱引用跟沒引用差不多,GC會(huì)直接回收掉,不管內(nèi)存是否足夠都會(huì)回收
staticclassEntryextendsWeakReferenceThreadLocal{
Objectvalue;
Entry(ThreadLocalk,Objectv){
super(k);
value=v;
引發(fā)內(nèi)存泄漏的原因
上面再介紹ThreadLocal基本使用api方法的時(shí)候也提到了,如果只是創(chuàng)建一個(gè)普通的線程Thread對(duì)象,是不會(huì)產(chǎn)生內(nèi)存泄漏問題的。因?yàn)閙ap是存儲(chǔ)在Thread對(duì)象中,一個(gè)普通線程執(zhí)行完了,那么這個(gè)線程的局部變量也就會(huì)被gc回收。
但如果結(jié)合到了線程池,一個(gè)Thread線程對(duì)象用完后放回線程池中,如果這個(gè)時(shí)候我們程序不顯示的調(diào)用remove()方法,那么就會(huì)造成內(nèi)存泄漏問題了。
因?yàn)镋ntry對(duì)象中的Key的弱引用,但是value還會(huì)存在,就會(huì)存在map中key
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 企業(yè)稅務(wù)籌劃管理工具包
- 2025湖南省煙草專賣局系統(tǒng)第二次調(diào)整聘用工作人員部分職位計(jì)劃的模擬試卷及答案詳解(名校卷)
- 2025江蘇鹽城市第七人民醫(yī)院招錄政府購(gòu)買服務(wù)用工14人模擬試卷有完整答案詳解
- 2025第十三屆貴州人才博覽會(huì)貴州水利水電職業(yè)技術(shù)學(xué)院引進(jìn)人才12人考前自測(cè)高頻考點(diǎn)模擬試題及答案詳解(易錯(cuò)題)
- 2025廣西百色市平果市國(guó)有平果林場(chǎng)擬聘用編外人員考前自測(cè)高頻考點(diǎn)模擬試題有完整答案詳解
- 2025年陜西省高教系統(tǒng)職業(yè)中等專業(yè)學(xué)校招聘模擬試卷附答案詳解(考試直接用)
- 2025年寧波前灣新區(qū)衛(wèi)生系統(tǒng)事業(yè)單位招聘高層次人才11人模擬試卷及1套參考答案詳解
- 公積金租房知識(shí)培訓(xùn)內(nèi)容課件
- 2025年新能源商用車輛市場(chǎng)綠色物流應(yīng)用場(chǎng)景:市場(chǎng)需求與應(yīng)用場(chǎng)景報(bào)告
- 2025河南開封國(guó)禹建設(shè)投資有限公司開招聘3人考前自測(cè)高頻考點(diǎn)模擬試題及1套完整答案詳解
- 半導(dǎo)體公司內(nèi)部管理制度
- 護(hù)理事業(yè)十五五發(fā)展規(guī)劃(2026-2030)
- 輸血常識(shí)試題及答案
- 省級(jí)職業(yè)技能大賽2024(高職組)口腔修復(fù)工藝賽項(xiàng)規(guī)程
- 《生態(tài)系統(tǒng)服務(wù)評(píng)估》課件
- 食堂滿意度測(cè)評(píng)制度
- 公司管理制度上墻圖
- 管道氣密性試驗(yàn)方案
- 2025年寶山區(qū)區(qū)屬國(guó)有(集體)企業(yè)招聘筆試參考題庫(kù)含答案解析
- 《影像增強(qiáng)檢查外周靜脈通路三級(jí)評(píng)價(jià)模式應(yīng)用規(guī)范》
- 2011-2016年第16-22屆華羅庚杯少年數(shù)學(xué)邀請(qǐng)賽幾何試題(小學(xué)高年級(jí)組)全解析
評(píng)論
0/150
提交評(píng)論