ART運(yùn)行時(shí)垃圾收集(GC)過(guò)程分析_第1頁(yè)
ART運(yùn)行時(shí)垃圾收集(GC)過(guò)程分析_第2頁(yè)
ART運(yùn)行時(shí)垃圾收集(GC)過(guò)程分析_第3頁(yè)
ART運(yùn)行時(shí)垃圾收集(GC)過(guò)程分析_第4頁(yè)
ART運(yùn)行時(shí)垃圾收集(GC)過(guò)程分析_第5頁(yè)
已閱讀5頁(yè),還剩7頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、罷ART運(yùn)行昂時(shí)垃圾收集搬(GC)過(guò)翱程分析扮ART運(yùn)行拔時(shí)與Dal拌vik虛擬扳機(jī)一樣,都藹使用了Ma鞍rk-Sw白eep算法背進(jìn)行垃圾回背收,因此它鞍們的垃圾回阿收流程在總敗體上是一致絆的。但是A邦RT運(yùn)行時(shí)俺對(duì)堆的劃分胺更加細(xì)致,氨因而在此基懊礎(chǔ)上實(shí)現(xiàn)了霸更多樣的回艾收策略。不隘同的策略有把不同的回收凹力度,力度罷越大的回收昂策略,每次斑回收的內(nèi)存敖就越多,并埃且它們都有鞍各自的使用扮情景。這樣骯就可以使得把每次執(zhí)行G艾C時(shí),可以擺最大限度地半減少應(yīng)用程敖序停頓。本半文就詳細(xì)分爸析ART運(yùn)耙行時(shí)的垃圾隘收集過(guò)程。笆ART運(yùn)行背時(shí)的垃圾收背集收集過(guò)程襖如圖1所示盎:拜圖1的最上邦面三個(gè)箭頭

2、藹描述觸發(fā)G霸C的三種情捌況,左邊的隘流程圖描述八非并行GC笆的執(zhí)行過(guò)程矮,右邊的流鞍程圖描述并挨行GC的執(zhí)俺行流程,接扳下來(lái)我們就骯詳細(xì)圖中涉柏及到的所有艾細(xì)節(jié)。辦o。班 佰 在前耙面一文中,版我們提到了襖兩種可能會(huì)觸發(fā)GC的拔情況。第一瓣種情況是沒(méi)芭有足夠內(nèi)存暗分配請(qǐng)求的凹分存時(shí),會(huì)半調(diào)用Hea罷p類的成員礙函數(shù)Col頒lectG班arbag礙eInte班rnal觸半發(fā)一個(gè)原因罷為kGcC岸auseF皚orAll凹o(jì)c的GC柏。第二種情芭況下分配出爸請(qǐng)求的內(nèi)存拜之后,堆剩板下的內(nèi)存超佰過(guò)一定的閥斑值,就會(huì)調(diào)稗用Heap吧類的成員函爸?jǐn)?shù)Requ愛(ài)estCo凹ncurr安entGC拌請(qǐng)求執(zhí)行一

3、癌個(gè)并行靶GC。襖d。擺 版 He稗ap類的成胺員函數(shù)Re捌quest岸Concu芭rrent昂GC的實(shí)現(xiàn)霸如下所示:八1。翱cpp癌 view絆 plai班n cop捌y 在CO癌DE上查看柏代碼片派生阿到我的代碼骯片斑W。靶void 胺Heap:拜:Requ案estCo搬ncurr昂entGC吧(Thre礙ad* s佰elf) 吧 隘J。襖 / 巴Make 盎sure 扮that 盎we ca耙n do 啊a con敗curre案nt GC把. 唉r。伴 Run靶time*八 runt芭ime =俺 Runt懊ime:絆Curre拔nt();安 班E。絆 DCH礙ECK(c瓣oncur阿r

4、ent_耙g敖c_); 笆 芭 if 板(runt皚ime =絆= NUL佰L | 柏!runt百ime-藹IsFin跋ished阿Start背ing()罷 | 辦y。拔 扮 !run巴time-靶IsCo吧ncurr擺entGc班Enabl扳ed()稗 唉9。柏 r俺eturn頒; 氨 M翱utexL跋ock m爸u(sel辦f, *L翱ocks:芭:runt皚ime_s擺hutdo白wn_lo暗ck_);巴 白z。般 i矮f (ru爸ntime敖-IsS胺hutti百ngDow暗n() 板 皚G。扳 疤 retu敗rn; 傲 案 澳 if 礙(self澳-IsH拌andli斑ngSta艾c

5、kOve哀rflow唉() 襖 拔s。啊 r俺eturn挨; 百 / 搬We al頒ready巴 have巴 a re扒quest案 pend隘ing, 骯no re敗ason 奧to st笆art m奧ore u俺ntil 癌we up矮date 哀 襖c。跋 / 扮concurrent拌_star柏t_byt奧es_. 板 昂 con霸curre百nt_st挨art_b岸ytes_敖 = st挨d:nu罷meric扳_limi柏ts昂:max靶(); 澳3。 俺 JNI爸Env* 班env =扮 self哀-Get般JniEn背v(); 斑 傲O。扳 DCH班ECK(W笆ellKn暗own

6、Cl皚asses吧:jav骯a_lan扳g_Dae鞍mons 佰!= NU敖LL); 靶 盎g。百 DCH壩ECK(W芭ellKn襖ownCl愛(ài)asses艾:jav吧a_lan胺g_Dae藹mons_暗reque笆stGC 叭!= NU挨LL); 拜 鞍e。絆 env稗-Cal哎lStat俺icVoi捌dMeth哀od(We凹llKno唉wnCla背sses:熬:java斑_(dá)lang班_Daemons, 伴 哎6。敗 凹 鞍 澳 般 辦 We疤llKno八wnCla熬sses:靶:java斑_(dá)lang安_Daem跋ons_r跋eques笆tGC);藹 芭v。阿 CHE佰CK(!e岸nv-E隘x

7、cept澳ionCh靶eck()隘); 疤 笆 唉這個(gè)函數(shù)定埃義在文件a挨rt/ru奧ntime百/gc/h柏eap.c安c。芭B。礙 懊 只有滿俺足以下四個(gè)暗條件,He耙ap類的成昂?jiǎn)T函數(shù)Re胺quest扒Concu挨rrent版GC才會(huì)觸版發(fā)一個(gè)并行挨GC:柏5。挨 佰 1. 佰ART運(yùn)行艾時(shí)已經(jīng)啟動(dòng)耙完畢。吧 盎 2. 隘ART運(yùn)行哀時(shí)支持并行八GC。AR熬T運(yùn)行時(shí)默矮認(rèn)是支持并吧行GC的,襖但是可以通鞍過(guò)啟動(dòng)選項(xiàng)斑-Xgc來(lái)昂關(guān)閉。芭Y。艾 拜 3. 胺ART運(yùn)行奧時(shí)不是正在捌關(guān)閉。愛(ài) 癌 4. 矮當(dāng)前線程沒(méi)版有發(fā)生棧溢捌出。版 啊 上述4拜個(gè)條件都滿敗足之后,H案eap類的矮成員函數(shù)

8、鞍Reque絆stCon白curre佰ntGC就熬將成員變量罷concu吧rrent拜_star氨t_byt耙es_的值背設(shè)置為類型昂size_白t的最大值巴,表示目前唉正有一個(gè)并唉行GC在等埃待執(zhí)行,以斑阻止觸發(fā)另扒外一個(gè)并行霸GC。版x。佰 敖 最后,佰Heap類背的成員函數(shù)礙Reque芭stCon矮curre癌ntGC調(diào)叭用Java暗層的jav笆a.lan安g.Dae板mons類八的靜態(tài)成員阿函數(shù)req叭uestG八C請(qǐng)求執(zhí)行芭一次并行G骯C。Jav癌a層的ja擺va.la伴ng.Da疤emons瓣類在加載的艾時(shí)候,會(huì)啟凹動(dòng)五個(gè)與堆瓣或者GC相板關(guān)的守護(hù)線暗程,如下所啊示:版5。哎jav

9、a岸 唉view 芭plain奧 copy巴 在COD氨E上查看代鞍碼片派生到阿我的代碼片埃k。翱publi壩c fin霸al cl敗ass D絆aemon頒s 壩 .爸.吧 吧 p把ublic敖 stat斑ic vo伴id st氨art()岸 癌 哀 Re柏feren隘ceQue隘ueDae鞍mon.I愛(ài)NSTAN鞍CE.st芭art()擺; 礙k。拜 案 Fi白naliz愛(ài)erDae跋mon.I捌NSTAN拔CE.st哀art()背; 按K。靶 頒 Fi按naliz矮erWat八chdog哀Daemo皚n.INS昂TANCE罷.star唉t(); 吧 捌g。辦 拔 He稗apTri霸mme

10、rD扮aemon哀.INST把ANCE.佰start岸(); 挨Q。昂 敗 GC百Daemo巴n.INS白TANCE暗.star岸t(); 疤 白 把 白 .拜.昂 板 般 這個(gè)類搬定義在文件半libco霸re/li岸bart/般src/m拔ain/j霸ava/j癌ava/l癌ang/D板aemon疤s.jav襖a中。安4。笆 埃 這五個(gè)胺守護(hù)線程分吧別是:暗 礙 1. 跋Refer班enceQ霸u(píng)eueD盎aemon搬:引用隊(duì)列扮守護(hù)線程。扮我們知道,敗在創(chuàng)建引用敗對(duì)象的時(shí)候把,可以關(guān)聯(lián)啊一個(gè)隊(duì)列。百當(dāng)被引用對(duì)熬象引用的對(duì)瓣象被GC回爸收的時(shí)候,疤被引用對(duì)象埃就會(huì)被加入疤到其創(chuàng)建時(shí)氨關(guān)聯(lián)的隊(duì)

11、列笆去。這個(gè)加跋入隊(duì)列的操胺作就是由R胺efere礙nceQu壩eueDa搬emon守斑護(hù)線程來(lái)完熬成的。這樣八應(yīng)用程序就壩可以知道那襖些被引用對(duì)班象引用的對(duì)絆象已經(jīng)被回笆收了。隘f。 拌 2. 叭Final班izerD扮aemon斑:析構(gòu)守護(hù)班線程。對(duì)于按重寫(xiě)了成員艾函數(shù)fin岸alize頒的對(duì)象,它叭們被GC決暗定回收時(shí),絆并沒(méi)有馬上霸被回收,而昂是被放入到俺一個(gè)隊(duì)列中罷,等待Fi敖naliz癌erDae鞍mon守護(hù)拜線程去調(diào)用版它們的成員佰函數(shù)fin拔alize安,然后再被艾回收。靶R。啊 骯 3. 辦Final礙izerW哀atchd板ogDae俺mon:析巴構(gòu)監(jiān)護(hù)守護(hù)笆線程。用來(lái)皚監(jiān)

12、控Fin按alize拌rDaem笆on線程的把執(zhí)行。一旦挨檢測(cè)那些重半定了成員函邦數(shù)fina搬lize的傲對(duì)象在執(zhí)行把成員函數(shù)f暗inali奧ze時(shí)超出百一定的時(shí)候扒,那么就會(huì)笆退出VM。骯F。埃 哎 4. 搬HeapT辦rimme扮rDaem靶on:堆裁拌剪守護(hù)線程稗。用來(lái)執(zhí)行邦裁剪堆的操按作,也就是斑用來(lái)將那些凹空閑的堆內(nèi)敖存歸還給系搬統(tǒng)。啊R。佰 八 5. 安GCDae伴mon:并笆行GC線程澳。用來(lái)執(zhí)行巴并行GC。擺 礙 Jav熬a層的案java.耙lang.頒Daemo哀ns類的靜柏態(tài)成員函數(shù)鞍reque捌stGC被挨調(diào)用時(shí),就搬會(huì)喚醒上述暗的并行GC傲線程,然后襖這個(gè)并行G疤C線程

13、就會(huì)敖通過(guò)JNI俺調(diào)用Hea艾p類的成員罷函數(shù)Con半curre岸ntGC,班它的實(shí)現(xiàn)如疤下所示:拌n。瓣cpp岸 view扒 plai皚n cop埃y 在CO霸DE上查看壩代碼片派生案到我的代碼鞍片吧f。疤void 盎Heap:按:Conc罷urren耙tGC(T骯hread骯* sel吧f) 疤 扳T。 壩 M愛(ài)utexL靶ock m藹u(sel柏f, *L矮ocks:安:runt昂ime_s邦hutdo吧wn_lo俺ck_);搬 襖i。俺 扮 if 背(Runt半ime:案Curre吧nt()-百IsSh靶uttin頒gDown捌() 懊 巴D。翱 白 retu瓣rn; 俺 稗 邦 /

14、扳Wait 昂for a爸ny GC班s cur邦rentl百y run盎ning 耙to fi埃nish.哎 邦j。凹 if 扳(Wait芭ForCo按ncurr般entGc八ToCom哎plete稗(self頒) = 扮colle絆ctor:瓣:kGcT霸ypeNo昂ne) 礙 班w。翱 C半ollec哎tGarb吧ageIn擺terna俺l(nex阿t_gc_矮type_八, kGc艾Cause芭Backg熬round般, fal霸se); 哎 胺9。 瓣 吧 佰這個(gè)函數(shù)定啊義在文件a跋rt/ru拔ntime般/gc/h艾eap.c盎c中。白h。柏 百 只要昂ART運(yùn)行疤時(shí)當(dāng)前不是扮處于

15、正在關(guān)頒閉的狀態(tài),敖那么Hea霸p類的成員半函數(shù)Con啊curre按ntGC就啊會(huì)檢查當(dāng)前芭是否正在執(zhí)昂行GC。如伴果是的話,挨那么就等待柏它執(zhí)行完成斑,然后再調(diào)背用Heap骯類的成員函伴數(shù)Coll礙ectGa艾rbage矮I(xiàn)nter擺nal觸發(fā)凹一個(gè)原因?yàn)榈KkGcCa擺useBa拌ckgro笆und的G斑C。否則的啊話,就直接盎調(diào)用Hea靶p類的成員函數(shù)Col白lectG耙arbag吧eInte耙rnal觸扮發(fā)一個(gè)原因版為kGcC熬auseB氨ackgr八ound的伴GC。芭i。熬 按 從這靶里就可以看稗到,無(wú)論是稗觸發(fā)GC的昂原因是kG艾cCaus爸eForA斑lloc,拔還是kGc搬Ca

16、use般Backg伴round拔,最終都是捌通過(guò)調(diào)用H哎eap類的翱成員函數(shù)C斑ollec佰tGarb拔ageIn凹terna啊l來(lái)執(zhí)行G癌C的。此外哎,還有第三斑種情況會(huì)觸扳發(fā)GC,如扳下所示:敗4。啊cpp愛(ài) view扒 plai礙n cop芭y 在CO澳DE上查看搬代碼片派生愛(ài)到我的代碼芭片昂a。哎void 半Heap:班:Coll隘ectGa版rbage壩(bool芭 clea岸r_sof扮t_ref背erenc拌es) 半 壩1。般 / 敗Even 哀if we骯 w靶aited辦 for 邦a GC 拔we st癌ill n埃eed t霸o do 版anoth捌er GC啊 sin

17、c哎e wea吧ks al把locat阿ed du瓣ring 敗the 敗W。翱 / 跋last 唉GC wi擺ll no艾t hav骯e nec挨essar暗ily b柏een c扮leare壩d. 愛(ài)1。 Thr癌ead* 背self 巴= Thr澳ead:笆Curre哎nt();懊 傲e。胺 Wai柏tForC叭oncur百rentG稗cToCo辦mplet暗e(sel唉f); 愛(ài)W。奧 Col伴lectG艾arbag柏eInte霸rnal(唉colle班ctor:拜:kGcT板ypeFu敗ll, k芭GcCau凹seExp盎licit挨, cle藹ar_so拔ft_re安feren鞍c

18、es);百 版w。 扒 敗 壩這個(gè)函數(shù)定拔義在文件a啊rt/ru般ntime壩/gc/h癌eap.c敗c。礙G。把 昂 當(dāng)我傲們調(diào)用Ja瓣va層的j癌ava.l板ang.S跋ystem奧的靜態(tài)成員疤函數(shù)gc時(shí)巴,如果AR翱T運(yùn)行時(shí)支拔持顯式GC把,那么就它矮就會(huì)通過(guò)J矮NI調(diào)用H岸eap類的跋成員函數(shù)C巴ollec唉tGarb骯ageIn隘terna岸l來(lái)觸發(fā)一傲個(gè)原因?yàn)閗矮GcCau熬seExp八licit安的GC。A藹RT運(yùn)行時(shí)扒默認(rèn)是支持辦顯式GC的板,但是可以鞍通過(guò)啟動(dòng)選鞍項(xiàng)-XX:版+Disa鞍bleEx懊plici芭tGC來(lái)關(guān)扳閉。凹7。案 搬 從上耙面的分析就岸可以看出,唉ART

19、運(yùn)行骯時(shí)在三種情隘況下會(huì)觸發(fā)按GC,這三斑種情況通過(guò)傲三個(gè)枚舉k懊GcCau澳seFor案Alloc靶、kGcC百auseB暗ackgr跋ound和八kGcCa埃useEx辦plici邦tk來(lái)描述胺。這三人枚吧舉的定義如芭下所示:鞍g。cpp爸 view皚 plai佰n cop芭y 在CO奧DE上查看敖代碼片派生八到我的代碼唉片襖Z。盎/ Wh把a(bǔ)t ca胺used 拔the G板C? 昂enum 埃GcCau靶se 皚 班 / 礙GC tr愛(ài)igger吧ed by扮 a fa拔iled 背alloc柏ation般. Thr半ead d疤oing 阿alloc俺ation爸 is b昂lock

20、e澳d wai艾ting 邦for G暗C bef邦ore 白J。頒 / 跋retry芭ing a壩lloca吧tion.邦 捌 kGc氨Cause頒ForAl壩loc, 吧 挨 / 案A bac版kgrou阿nd GC哎 tryi藹ng to哀 ensu叭re th斑ere i皚s fre瓣e mem翱ory a皚head 艾of al盎locat矮ions.骯 按5。笆 kGc版Cause懊Backg靶round芭, 翱 / 埃An ex扳plici把t Sys巴tem.g笆c() c壩all. 芭 百N。拔 kGc八Cause白Expli哀cit, 搬 ; 吧 懊 這三個(gè)捌枚舉定義在阿文

21、件ar唉t/run暗time/藹gc/he斑ap.h中懊。霸P。岸 骯 從上面般的分析還可跋以看出,A吧RT運(yùn)行時(shí)版的所有GC奧都是以He班ap類的成翱員函數(shù)Co挨llect耙Garba襖geInt靶ernal氨為入口,它邦的實(shí)現(xiàn)如下拔所示:襖4。爸cpp耙 view罷 plai案n cop扒y 在CO翱DE上查看挨代碼片派生岸到我的代碼藹片敗a。瓣colle稗ctor:礙:GcTy敗pe He骯ap:C挨ollec鞍tGarb背ageIn澳terna耙l(col壩lector:Gc矮Type 矮gc_ty埃pe, G俺cCaus叭e gc_班cause愛(ài), 捌x。版 艾 佰 背 巴 白 哀

22、阿 芭 礙 b敖ool c岸lear_班soft_辦refer案ences氨) 罷 Thr白ead* 般self 芭= Thr翱ead:頒Curre隘nt();案 跋Q。矮 .骯. 俺 / 隘Ensur芭e the柏re is扮 only艾 one 敗GC at唉 a ti啊me. 唉W。伴 boo癌l sta爸rt_co版llect扮 = fa俺lse; 啊 愛(ài) whi哎le (!暗start捌_coll哎ect) 辦 芭 佰 澳 哀 Mute安xLock邦 mu(s艾elf, 暗*gc_c芭omple拜te_lo八ck_);半 背E。岸 胺 if (白!is_g疤c_run凹ning_辦)

23、 百 邦 is骯_gc_r哎unnin跋g_ = 霸true;絆 阿 扮 st般art_c靶ollec佰t = t半rue; 凹 凹 頒 愛(ài) 胺 板 i邦f (!s佰tart_百colle礙ct) 辦 傲 巴 / T愛(ài)ODO: 俺timin斑glog 罷this.岸 般 邦 Wait爸ForCo襖ncurr艾entGc八ToCom皚plete背(self鞍); 翱s。笆 笆 .奧. 矮 疤 哎 .盎. 班 if 擺(gc_t爸ype =安= col拔lecto藹r:kG佰cType翱Stick哎y & 靶 把x。邦 叭 allo拌c_spa鞍ce_-骯Size(半) Is胺Concu稗r(nóng)ren

24、t芭() =哎 conc叭urren拔t_gc_巴 & c案ur_co版llect靶or-G板e(cuò)tGcT芭ype()盎 = g罷c_typ襖e) 俺 啊d。愛(ài) 盎 coll靶ector拌 = cu壩r_col背lecto按r; 扮 艾 brea凹k; 藹 案 壩 .板. 壩 col頒lecto唉r-cl半ear_s半oft_r斑efere伴nces_案 = cl霸ear_s叭oft_r凹efere柏nces;辦 埃u。按 col班l(xiāng)ecto靶r-Ru奧n(); 扮 背 .絆. 熬 岸 Mute爸xLock艾 mu(s八elf, 奧*gc_c八omple版te_lo懊ck_);阿 奧L。叭 般

25、is_g稗c_run凹ning_佰 = fa扳lse; 鞍 笆 絆 last百_gc_t鞍ype_ 凹= gc_稗type;襖 稗 俺 / W絆ake a扒nyone岸 who 瓣may h把a(bǔ)ve b罷een w伴aitin扮g for叭 the 案GC to佰 comp芭lete.疤 扒R。拜 霸 gc_c八omple拌te_co阿nd_-版Broad巴cast(爸self)藹; 拜j。 板 .案. 昂 ret俺urn g壩c_typ隘e; 案 叭 稗這個(gè)函數(shù)定翱義在文件a奧rt/ru唉ntime扮/gc/h挨eap.c凹c。捌b。氨 疤 參數(shù)皚gc_ty瓣pe和gc霸_caus捌e分別用

26、來(lái)霸描述要執(zhí)行傲的GC的類挨型和原因,哀而參數(shù)cl靶ear_s啊oft_r愛(ài)efere疤nces用敖來(lái)描述是否吧要回收被軟奧引用對(duì)象引藹用的對(duì)象。愛(ài)L。盎 柏 He凹ap類的成瓣員函數(shù)Co矮llect班Garba把geInt翱ernal阿的執(zhí)行邏輯擺如下所示:埃k。澳 艾 1.辦 通過(guò)一個(gè)搬while扮循環(huán)不斷地把檢查Hea唉p類的成員盎變量is_艾gc_ru凹nning岸_,直到它骯的值等于f扳alse為耙止,這表示俺當(dāng)前沒(méi)有其百它線程正在扳執(zhí)行GC。敗當(dāng)它的值等艾于true拔時(shí),就表示芭在其它線程拔正在執(zhí)行G般C,這時(shí)候盎就要調(diào)用H艾eap類的俺成員函數(shù)W拔aitFo柏rConc唉urre

27、n胺tGcTo艾Compl埃ete等待隘其執(zhí)行完成白。注意,在拜當(dāng)前GC執(zhí)襖行之前,H艾eap類的藹成員變量i稗s_gc_板runni跋ng_會(huì)被唉設(shè)置為tr拌ue。佰B。礙 阿 2.癌 如果當(dāng)前藹請(qǐng)求執(zhí)行的柏GC的類型翱為kGcT盎ypeSt敖icky,絆但是當(dāng)前A壩lloca佰tion 矮Space班的大小小于稗Heap類版的成員變量版min_a艾lloc_愛(ài)space懊_size案_for_埃stick百y_gc_阿指定的閥值把,那么就改盎為執(zhí)行類型伴為kGcT啊ypePa巴rtial藹。關(guān)于類型凹為kGcT懊ypeSt佰icky的昂GC的執(zhí)行按限制,可以參數(shù)前面一疤文。凹P。半 凹 3

28、.耙 從Hea搬p類的成員擺變量mar板k_swe扳ep_co吧llect哎ors_指跋向的一個(gè)垃啊圾收集器列骯表找到一個(gè)敖合適的垃圾吧收集器來(lái)執(zhí)癌行GC。從礙前面一文可版以知道,A翱RT運(yùn)行時(shí)澳在內(nèi)部創(chuàng)建班了六個(gè)垃圾八收集器。這巴六個(gè)垃圾收集器分為兩吧組,一組支氨持并行GC氨,另一組不耙支持。每一安組都是由三拜個(gè)類型分別翱為kGcT搬ypeSticky、鞍kGcTy澳pePar安tial和白kGcTy扒peFul骯l的垃垃圾邦收集器組成笆。這里說(shuō)的笆合適的垃圾頒收集器,是伴指并行性與哎Heap類擺的成員變量扳concu澳rrent岸_gc_一拜致,并且類百型也與參數(shù)岸gc_ty班pe一致的背

29、垃圾收集器吧。叭W。暗 盎 4.安 找到合適背的垃圾收集扮器之后,就皚將參數(shù)cl擺ear_s拔oft_r盎efere澳nces的靶值保存它的哀成員變量c擺lear_骯soft_敖refer哎ences安_中,以便把可以告訴它俺要不要回收霸被軟引用對(duì)疤象引用的對(duì)辦象,然后再扮調(diào)用它的成背員函數(shù)Run來(lái)執(zhí)行G骯C。挨g。隘 背 5.板 GC執(zhí)行啊完畢,將H癌eap類的芭成員變量i鞍s_gc_壩runni按ng_設(shè)置扳為fals佰e,以表示傲當(dāng)前GC已凹經(jīng)執(zhí)行完畢安,下一次請(qǐng)敗求的GC可扮以執(zhí)行了。礙此外,也會(huì)柏將Heap巴類的成員變拜量last阿_gc_t懊ype_設(shè)絆置為當(dāng)前執(zhí)安行的GC的稗類型

30、。這樣案下一次執(zhí)行熬GC時(shí),就矮可以執(zhí)行另斑外一個(gè)不同癌類型的GC鞍。例如,如百果上一次執(zhí)八行的GC的班類型為kG柏cType藹Stick板y,那么接拔下來(lái)的兩次安GC的類型背就可以設(shè)置襖為kGcT芭ypePa扒rtial叭和kGcT耙ypeFu罷ll,這樣扮可以使得每襖次都能執(zhí)行叭有效的GC拜。襖U。哎 八 6.傲 通過(guò)He拌ap類的成跋員變量gc埃_comp敖lete_邦cond_案喚醒那些正哎在等待GC耙執(zhí)行完成的柏線程。鞍o。版 壩 在辦上面的六個(gè)唉步驟中,最扳重要的就是按第四步了。邦從前面一文敖可以知道,稗所有的垃圾鞍收集器都是瓣從Garb半ageCo礙llect版or類繼承翱下來(lái)的

31、,因背此上面的第矮四步實(shí)際上澳執(zhí)行的是G扒arbag熬eColl背ector奧類的成員函八數(shù)Run,奧它的實(shí)現(xiàn)如壩下所示:澳C。巴cpp鞍 view隘 plai胺n cop昂y 在CO吧DE上查看稗代碼片派生隘到我的代碼襖片伴2。拜void 柏Garba耙geCol扮lecto跋r:Ru跋n() 埃 扒 Thr拔eadLi耙st* t搬hread拔_list哎 = Ru藹ntime襖:Cur藹rent(奧)-Ge扳tThre奧adLis爸t(); 霸 拔S。皚 uin罷t64_t耙 star爸t_tim骯e = N背anoTi唉me();巴 拌Z。耙 pau扮se_ti翱mes_.邦clear

32、白(); 唉 dur巴ation敖_ns_ 捌= 0; 隘 皚 Ini澳tiali絆zePha骯se();叭 擺 if 岸(!IsC襖oncur翱rent(唉) 邦 絆 /哀/ Pau襖se is壩 the 扳entir埃e len白gth o巴f the背 GC. 拔 翱5。跋 u辦int64斑_(dá)t pa俺use_s挨tart 頒= Nan敗oTime跋(); 背E。安 A案TRACE俺_BEGI阿N(Ap邦plica藹tion 半threa隘ds su哀spend疤ed);暗 氨U。半 t盎hread襖_list襖-Sus案pendA熬ll();襖 M礙arkin擺gPhas罷e(); 艾

33、 按 R柏eclai翱mPhas昂e(); 八 矮 t吧hread白_list澳-Res把umeAl般l(); 瓣 敗 A熬TRACE伴_(kāi)END(埃); 澳 u氨int64靶_t pa佰use_e斑nd = 愛(ài)NanoT耙ime()頒; 瓣m。巴 p板ause_疤times巴_.pus皚h_bac扒k(pau半se_en搬d - p頒ause_伴start霸); 澳i。皚 e佰lse 奧 絆 T叭hread熬* sel愛(ài)f = T版hread百:Cur斑rent(白); 傲G。安 隘 霸 拜 Read瓣erMut胺exLoc班k mu(暗self,愛(ài) *Loc佰ks:m班utato氨r_loc

34、背k_); 癌 搬Q。敖 扒 Mark埃ingPh埃ase()拜; 鞍 笆 皚 b稗ool d八one =藹 fals吧e; 哀 w胺hile 凹(!don扮e) 絆 矮 敗 uint凹64_t 藹pause翱_star矮t = N跋anoTi爸me();絆 艾3。艾 拌 ATRA矮CE_BE般GIN(絆Suspe艾nding半 muta扒tor t搬hread半s); 愛(ài) 翱K。藹 安 thre拔ad_li白st-S擺uspen背dAll(澳); 擺 邦 ATRA般CE_EN頒D(); 頒 凹 搬 ATRA翱CE_BE把GIN(矮All m瓣utato霸r thr耙eads 哎suspe皚n

35、ded絆); 矮V。啊 隘 done艾 = Ha吧ndleD半irtyO搬bject愛(ài)sPhas胺e(); 擺 鞍i。搬 澳 ATRA板CE_EN白D(); 笆 笆 白 uint氨64_t 鞍pause巴_end 案= Nan伴oTime俺(); 拌z。扒 翱 ATRA愛(ài)CE_BE哎GIN(疤Resum拜ing m安utato鞍r thr盎eads哀); 般3。般 昂 thre伴ad_li挨st-R辦esume半All()板; 鞍 傲 ATRA澳CE_EN矮D(); 疤 擺 盎 paus稗e_tim挨es_.push_b礙ack(p暗ause_皚end -百 paus伴e_sta埃rt); 頒

36、 隘X。昂 靶 奧 瓣 罷 敖 Read俺erMut翱exLoc板k mu(胺self,絆 *Loc絆ks:m絆utato扒r_loc吧k_); 捌 芭1。礙 拌 Recl奧aimPh哀ase()疤; 鞍 凹 愛(ài) uin搬t(yī)64_t叭 end_安time 瓣= Nan邦oTime頒(); 板T。擺 dur伴ation邦_ns_ 白= end矮_time伴 - st啊art_t骯ime; 盎 把b。 壩 Fin唉ishPh扮ase()安; 叭 把 巴這個(gè)函數(shù)定佰義在文件a邦rt/ru澳ntime般/gc/c伴ollec白tor/g叭arbag凹e_col班l(xiāng)ecto埃r.cc中百。頒T。癌 版

37、Ga八rbage澳Colle俺ctor類唉的成員函數(shù)八Run的實(shí)爸現(xiàn)就對(duì)應(yīng)于斑圖1所示的礙左邊和右邊捌的兩個(gè)流程暗。靶e。岸 啊 圖1俺所示的左邊藹流程是用來(lái)捌執(zhí)行非并行半GC的,過(guò)隘程如下所示笆:拔 隘 1.埃 調(diào)用子類版實(shí)現(xiàn)的成員叭函數(shù)Ini柏tiali叭zePha骯se執(zhí)行G礙C初始化階懊段。拌R。拜 芭 2.骯 掛起所有扒的ART運(yùn)唉行時(shí)線程。襖 拔 3.耙 調(diào)用子類搬實(shí)現(xiàn)的成員凹函數(shù)Mar班ki壩ngPha骯se執(zhí)行G絆C標(biāo)記階段案。佰Q。昂 般 4.百 調(diào)用子類俺實(shí)現(xiàn)的成員把函數(shù)Rec盎laimP把hase執(zhí)吧行GC回收吧階段。罷j。氨 氨 5.埃 恢復(fù)第2邦步掛起的A案RT運(yùn)行時(shí)

38、頒線程。岸 般 6.佰 調(diào)用子類隘實(shí)現(xiàn)的成員擺函數(shù)Fin氨ishPh壩ase執(zhí)行搬GC結(jié)束階絆段。岸f。瓣 柏 圖1凹所示的右邊哀流程是用來(lái)皚執(zhí)行并行G霸C的,過(guò)程柏如下所示:懊 耙 1.把 調(diào)用子類暗實(shí)現(xiàn)的成員芭函數(shù)Ini俺tiali拔zePha八se執(zhí)行G敖C初始化階頒段。骯9。奧 岸 2.背 獲取用于啊訪問(wèn)Jav拌a堆的鎖。唉 斑 稗 3. 昂調(diào)用子類實(shí)半現(xiàn)的成員函隘數(shù)Mark辦ingPh扳ase執(zhí)行板GC并行標(biāo)哀記階段。靶U。邦 拜 4.把 釋放用于靶訪問(wèn)Jav瓣a堆的鎖。板 鞍 5.爸 掛起所有熬的ART運(yùn)礙行時(shí)線程。吧 安 6.奧 調(diào)用子類胺實(shí)現(xiàn)的成員般函數(shù)Han頒dleDi敗rt

39、yOb皚jects把Phase熬處理在GC敖并行標(biāo)記階佰段被修改的百對(duì)象。爸7。瓣 藹 7.背 恢復(fù)第4版步掛起的A叭RT運(yùn)行時(shí)啊線程。敗 捌 8.版 重復(fù)第5到第7步,爸直到所有在疤GC并行階愛(ài)段被修改的斑對(duì)象都處理稗完成。埃y。瓣 巴 9.哀 獲取用于昂訪問(wèn)Jav壩a堆的鎖。斑 絆 10瓣. 調(diào)用子拔類實(shí)現(xiàn)的成般員函數(shù)Re跋claim拔Phase捌執(zhí)行GC回藹收階段。熬J。胺 扒 11敗. 釋放用癌于訪問(wèn)Ja熬va堆的鎖叭。把 百 12搬. 調(diào)用子巴類實(shí)現(xiàn)的成半員函數(shù)Fi伴nishP般hase執(zhí)胺行GC結(jié)束疤階段。襖B。跋 罷 從上盎面的分析就絆可以看出,鞍并行GC和癌非并行GC胺的區(qū)別在

40、于安:矮 拌 1.案 非并行G挨C的標(biāo)記階翱段和回收階扳段是在掛住頒所有的AR芭T運(yùn)行時(shí)線哀程的前提下疤進(jìn)行的,因傲此,只需要傲執(zhí)行一次標(biāo)熬記即可。霸e。八 拜 2.搬 并行GC氨的標(biāo)記階段拔只鎖住了J半a八va堆,因隘此它不能阻辦止那些不是壩正在分配對(duì)案象的ART皚運(yùn)行時(shí)線程擺同時(shí)運(yùn)行,傲而這些同進(jìn)稗運(yùn)行的AR隘T運(yùn)行時(shí)線癌程可能會(huì)引唉用了一些在熬之前的標(biāo)記氨階段沒(méi)有被啊標(biāo)記的對(duì)象。如果不對(duì)版這些對(duì)象進(jìn)癌行重新標(biāo)記癌的話,那么八就會(huì)導(dǎo)致它百們被GC回礙收,造成錯(cuò)扳誤。因此,稗與非并行G扳C相比,并案行GC多了耙一個(gè)處理臟背對(duì)象的階段版。所謂的臟罷對(duì)象就是我巴們前面說(shuō)的澳在GC標(biāo)記阿階段同時(shí)運(yùn)

41、佰行的ART搬運(yùn)行時(shí)線程斑訪問(wèn)或者修按改過(guò)的對(duì)象捌。E。辦 熬 3.把 并行GC斑并不是自始暗至終都是并靶行的,例如扮,處理臟對(duì)阿象的階段就敖是需要掛起靶除GC線程扮以外的其它拔ART運(yùn)行哎時(shí)線程,這阿樣才可以保愛(ài)證標(biāo)記階段芭可以結(jié)束。巴T。凹 氨 從前擺面一文可以按知道,Ga矮rbage艾Colle跋ctor類澳有三個(gè)直接伴或者間接的霸子類Mar啊kSwee稗p、Par胺tialM伴arkSw礙eep和S版ticky凹MarkS搬weep都扒可以用來(lái)執(zhí)拔行垃圾回收癌,其中,P襖artia扳lMark按Sweep半類又是從M俺arkSw般eep類直愛(ài)接繼承下來(lái)辦的,而St骯ickyM哀arkS

42、w版eep類是奧從Part版ialMa耙rkSwe拔ep類直接瓣繼承下來(lái)的傲。Mark白Sweep挨類用來(lái)回收奧Zygot唉e Spa敖ce和Al扳locat扮ion S把pace的挨垃圾,Pa挨rtial氨Ma敗rkSwe澳ep類用來(lái)芭回收All藹ocati骯on Sp伴ace的垃邦圾,Sti斑ckyMa壩rkSwe霸ep類用來(lái)扳回收上次G隘C以來(lái)在Allcat笆ion S暗pace上芭分配的最終拌又沒(méi)有被引翱用的垃圾。盎a。柏 唉 接下挨來(lái),我們就把主要分析A八RT運(yùn)行時(shí)白線程的掛起皚和恢復(fù)過(guò)程柏,以及Ma靶rkSwe叭ep、Pa襖rtial懊MarkS板weep和霸Stick跋yMark

43、擺Sweep傲這三個(gè)類是挨執(zhí)行Ini哎tiali扮zePha巴se、Ma頒rking邦Phase絆、Hand啊leDir壩tyObj白ectsP扳hase、氨Recla埃imPha班se和Fi艾nishP翱hase的按五個(gè)GC階扮段的過(guò)程。挨h。矮 唉 1. 氨ART運(yùn)行懊時(shí)線程的掛俺起芭 壩 從上面搬的分析可以爸知道,AR隘T運(yùn)行時(shí)線暗程的掛起是靶通過(guò)調(diào)用T敗hread扒List類辦的成員函數(shù)壩Suspe熬ndAll哀實(shí)現(xiàn)的,如捌下所示:柏s。癌cpp啊 view擺 plai笆n cop澳y 在CO骯DE上查看敗代碼片派生辦到我的代碼襖片俺h。背void 板Threa芭dList昂:Sus艾

44、pendA拌ll() 伴 襖B。頒 Thr啊ead* 澳self 班= Thr扒ead:拔Curre藹nt();埃 岸c。頒 .癌. 愛(ài) M柏utexL稗ock m芭u(sel叭f(wàn), *L頒ocks:芭:thre耙ad_li奧st_lo班ck_);板 吧C。哀 敗 瓣 爸 Mute盎xLock把 mu2(八self,柏 *Loc昂ks:t班hread岸_susp靶end_c靶ount_挨lock_按); 岸y。邦 扒 / U柏pdate岸 glob叭al su把spend暗 all 叭state扮 for 奧attac靶hing 案threa骯ds. 艾F(xiàn)。扒 熬 +su板spend跋_all

45、_氨count傲_; 半 班 / I胺ncrem搬ent e暗veryb礙odys鞍 susp挨end c般ount 暗(exce奧pt ou傲r own巴). 安i。疤 壩 for 啊(cons靶t aut版o& th敗read 皚: lis捌t_) 礙 凹8。絆 扒 if瓣 (thr般ead =斑= sel伴f) 昂 跋 柏 鞍conti邦nue; 敗 凹 扮 拌 皚 骯 .般. 跋 拌 吧 th藹read-叭Modi敗fySus暗pendC耙ount(巴self,伴 +1, false柏); 凹l。半 氨 皚 版 案 / 瓣Block案 on t埃he mu礙tator拜 lock靶 u

46、nti暗l all稗 Runn俺able 靶threa昂ds re哎lease骯 thei白r sha岸re of氨 acce哎ss. 敖c。安#if H安AVE_TIMED_盎RWLOC板K / 斑Timeo埃ut if罷 we w叭ait m骯ore t芭han 3壩0 sec捌onds.敗 罷m。啊 if 霸(UNLI案KELY(把!Lock捌s:mu絆tator佰_lock艾_-Ex啊clusi頒veLoc盎kWith骯Timeo爸ut(se壩lf, 3挨0 * 1奧000, 埃0) 耙 八R。藹 U佰nsafe案LogFa板talFo奧rThre頒adSus半pendA耙llTime

47、out(頒self)敖; 拜d。 搬#else安 熬 Loc扮ks:m柏utato爸r_loc安k_-E按xclus叭iveLo暗ck(se傲lf); 壩 稗D(zhuǎn)。靶#endi罷f 白 .佰. 扒 奧 壩這個(gè)函數(shù)定柏義在文件a壩rt/ru埃ntime阿/thre啊ad_li氨st.cc百中。背q。凹 絆 所有的壩ART運(yùn)行絆時(shí)線程都保罷存在Thr皚eadLi班st類的成襖員變量li班st_描述凹的一個(gè)列表唉,遍歷這個(gè)盎列表時(shí),需邦要獲取Lo盎ck類的成斑員變量th佰read_靶l(wèi)ist_啊lock_扳描述的一個(gè)氨互斥鎖。氨J。凹 哀 Thr唉eadList類有一爸個(gè)成員變量邦suspe按nd_a

48、l斑l_cou凹nt_,用斑來(lái)描述全局叭的線程掛起案計(jì)數(shù)器。在翱所有的AR頒T運(yùn)行時(shí)線巴程掛起期間靶,如果有新耙的線程將自唉己注冊(cè)為A奧RT運(yùn)行時(shí)辦線程,那么捌它也會(huì)將自皚己掛起來(lái),艾而判斷所有捌的ART運(yùn)行時(shí)佰線程是不是背處于掛起期半間,就是通俺過(guò)Thre耙adLis奧t類的成員敖變量sus瓣pend_敖all_c稗ount_暗的值是否大扮于0進(jìn)行的霸。因此,T案hread白List類板的成員函數(shù)啊Suspe挨ndAll啊在掛起所有頒的ART運(yùn)斑行時(shí)線程之辦前,會(huì)將T矮hread斑List類鞍的成員變量癌suspe八nd_al靶l(wèi)_cou版nt_的值敗增加1。癌s。邦 瓣 接下來(lái)百,Thre

49、案adLis阿t類的成員安函數(shù)Sus岸pendA伴ll遍歷所疤有的ART絆運(yùn)行時(shí)線程版,并且調(diào)用翱Threa斑d類的成員氨函數(shù)Mod艾ifySu板spend邦Count叭將它內(nèi)部的藹線程計(jì)算數(shù)俺器增加1,絆如下所示:襖C。襖cpp啊 view唉 plai啊n cop柏y 在CO澳DE上查看胺代碼片派生壩到我的代碼版片壩d。隘void 柏Threa柏d:At耙omicS矮etFla絆g(Thr隘eadFl背ag fl唉ag) 拜 哎N。奧 and翱roid_斑atomi邦c_or(澳flag,百 &sta盎te_an按d_fla襖gs_.a伴s_int藹); 吧Z。 背void 斑Threa艾d

50、:At艾omicC礙learF笆lag(T氨hread扒Flag 熬flag)盎 懊G。擺 and敗roid_藹atomi斑c_and俺(-1 啊 flag爸, &st拌ate_a岸nd_fl哀ag瓣s_.as捌_int)鞍; 搬P。 氨.扮. 佰void 挨Threa疤d:Mo八difyS皚uspen瓣dCoun捌t(Thr扳ead* 罷self,霸 int 盎delta白, boo把l for挨_debu壩gger)案 敖w。癌 .矮. 唉 sus愛(ài)pend_耙count傲_ += 稗delta鞍; 熬 .藹. 盎 if 拜(susp耙end_c氨ount_霸 = 0鞍) 般 A版tomi

51、c藹Clear翱Flag(佰kSusp吧endRe頒quest搬); 昂S。搬 e岸lse 暗 柏 A耙tomic耙SetFl襖ag(kS敗uspen白dRequ捌est);拔 背x。 芭 艾這三個(gè)函數(shù)昂定義在文件叭art/r邦untim芭e/thr白ead.c絆c中。懊2。罷 癌 Thr霸ead類的懊成員函數(shù)M絆odify扮Suspe皚ndCou昂nt的實(shí)現(xiàn)搬很簡(jiǎn)單,它叭主要就是將敖成員變量s壩uspen版d_cou傲nt_的值安增加del背ta,并且敗判斷增加后班的值是否等襖于0。如果皚等于0,就哀調(diào)用成員函搬數(shù)Atom般icCle擺arFla搬g將另外一扮個(gè)成員變量稗state挨_and

52、_愛(ài)flags頒_的int拌值的kSu壩spend艾Reque啊st位清0搬,表示線程拌沒(méi)有掛起請(qǐng)吧求。否則的拌話,就調(diào)用疤成員函數(shù)A皚tomic敖SetFl敖ag將成員艾變量sta辦te_an盎d_背flags拜_的int值的kSu八spend百Reque佰st位置1斑,表示線程靶有掛起請(qǐng)求百。鞍e。半 扮 回到前絆面Thre頒adLis挨t類的成員傲函數(shù)Sus胺pendA吧ll中,全艾局ART運(yùn)傲行時(shí)線程掛白起計(jì)數(shù)器和八每一個(gè)AR礙T運(yùn)行時(shí)線拜程內(nèi)部的線百程掛起計(jì)數(shù)岸器的操作都胺是需要在獲凹取Lock癌s類的靜態(tài)耙成員變量t隘hread版_susp俺end_c扒ount_八lock_扮描述

53、的一個(gè)扮互斥鎖的前絆提下進(jìn)行的拔。鞍8。啊 奧 最后,拜Threa扒dList頒類的成員函伴數(shù)Susp骯endAl邦l通過(guò)獲取皚Locks佰類的靜態(tài)成百員變量mu藹tator班_lock拔_描述的一阿個(gè)讀寫(xiě)鎖的八寫(xiě)訪問(wèn)來(lái)等哎待所有的A艾RT運(yùn)行時(shí)俺線程掛起的絆。這是如何哀做到的呢?骯在前面一文頒中,我們提岸到,ART佰運(yùn)行時(shí)提供襖給由DEX鞍字節(jié)碼翻譯翱而來(lái)的本地八機(jī)器代碼使搬用的一個(gè)函辦數(shù)表中,包凹含了一個(gè)p八Check柏Suspe頒nd函數(shù)指扒針,該函數(shù)白指針指向了哎函數(shù)Che挨ckSus按pendF奧romCo藹de。于是胺,每一個(gè)A鞍RT運(yùn)行時(shí)隘線程在執(zhí)行般本地機(jī)器代挨碼的過(guò)程中捌,就

54、會(huì)周期翱性地通過(guò)調(diào)敗用函數(shù)Ch芭eckSuspend愛(ài)FromC佰ode來(lái)檢澳查自己是否板需要掛起。伴這一點(diǎn)與前懊面一文分析八的Dalv拌ik虛擬機(jī)艾線程掛起的佰過(guò)程是類似哀的。熬E。岸 函數(shù)C氨he霸ckSus哎pendF般romCo氨de的實(shí)現(xiàn)拜如下所示:啊cpp伴 view阿 plai捌n cop埃y 在CO邦DE上查看凹代碼片派生伴到我的代碼癌片罷J。唉void 拔Check百Suspe氨ndFro壩mCode奧(Thre拌ad* t胺hread捌) 艾U。盎 S傲HARED皚_LOCK襖S_REQ拜UIRED盎(Lock案s:mu懊tator笆_lock暗_) 疤 案9。案 .阿.

55、藹 Che翱ckSus搬pend(啊threa矮d); 背 半 這個(gè)函壩數(shù)定義在文半件art/頒runti氨me/en斑trypo板ints/佰quick絆/quic耙k_thr捌ead_e半ntryp扮oints頒.cc中。半S。扳 傲 函數(shù)C拜heckS背uspen澳dFrom扳Code調(diào)靶用另外一個(gè)搬函數(shù)Che耙ckSus百pend檢百查當(dāng)前線程白是否需要掛瓣起,后者的襖實(shí)現(xiàn)如下所板示:癌G。拔cpp扒 view伴 plai斑n cop把y 在CO傲DE上查看安代碼片派生壩到我的代碼靶片般B。吧stati班c inl扮ine v矮oid C岸heckS矮uspen俺d(Thr澳ead*

56、捌threa奧d) SH礙ARED_阿LOCKS昂_REQU皚IRED(柏Locks扒:mut暗ator_鞍l(fā)ock_邦) 捌I。翱 for癌 (;)敗 俺 癌 if (澳threa叭d-Re哀adFla吧g(kCh跋eckpo百intRequest凹) 阿 翱Q。暗 佰 thre爸ad-R凹unChe矮ckpoi藹ntFun巴ction奧(); 敗b。熬 扳 thre邦ad-A癌tomic拌Clear扒Flag(矮kChec皚kpoin傲tRequ艾est);敖 傲1。盎 埃 else瓣 if (唉threa笆d-Re佰adFla襖g(kSu柏spend矮Reque按st) 扳 靶S。礙 爸

57、 thre稗ad-F跋ullSu頒spend襖Check啊(); 藹 熬 else哀 鞍 罷 brea邦k; 耙 靶 半 絆 懊這個(gè)函數(shù)定背義在文件a骯rt/ru把ntime艾/entr板ypoin案ts/en捌trypo襖int_u隘tils.阿h中。澳i。靶 把 從上面鞍的分析可以敖知道,如果壩當(dāng)前線程的哎線程掛起計(jì)澳數(shù)器不等于暗0,那么它拜內(nèi)部的一個(gè)斑標(biāo)記位kS絆uspen案dRequ百est被設(shè)霸置為1。這隘時(shí)候函數(shù)C盎heckS挨uspen佰d就會(huì)調(diào)用稗Threa爸d類的成員板函數(shù)Ful疤lSusp爸endCh絆eck來(lái)將挨自己掛起。藹此外,函數(shù)礙Check瓣Suspe鞍nd還會(huì)檢襖

58、查線程內(nèi)部昂的另外一個(gè)扒標(biāo)記位kC半heckp礙ointR艾eques氨t是否被設(shè)按置為1。如斑果被設(shè)置為岸1的話,那俺么就說(shuō)明線按程有一個(gè)C艾heck 挨Point巴需要執(zhí)行,八這時(shí)候就會(huì)拌先調(diào)用Th吧read類胺的成員函數(shù)斑RunCh皚eckpo半intFu跋nctio頒n運(yùn)行該C扒heck 啊Point敗,接著再將搬線程內(nèi)部的懊標(biāo)記位kC矮heckp拌ointR案eques柏t清0。關(guān)襖于線程的C搬heck 盎Point叭,我們后面隘再分析。氨n。頒 翱 Thr矮ead類的板成員函數(shù)F拌ullSu疤spend暗Check熬的實(shí)現(xiàn)如下疤所示:頒3。阿cpp伴 view佰 plai疤n co

59、p捌y 在CO拔DE上查看胺代碼片派生吧到我的代碼拌片跋g。扒void 辦Threa壩d:Fu疤llSus笆pendC霸heck(芭) 叭Y。叭 .皚. 暗 / 拌Make 翱threa澳d app盎ear s笆uspen昂ded t懊o oth吧er th捌reads襖, rel矮ease 阿mutat絆or_lo哎ck_. 拜 柏H。板 Tra伴nsiti襖onFro皚mRunn跋ableT案oSusp耙ended皚(kSus跋pende版d); 邦J。矮 / 鞍Trans藹ition背 back百 to r捌unnab俺le no唉ting 唉reque澳sts t岸o sus疤pend

60、,般 re-a扳cquir礙e sha拌re on埃 muta翱tor_l絆ock_.伴 百S。扒 Tra捌nsiti唉onFro傲mSusp笆ended把ToRun背nable翱(); 罷W。壩 .板. 拔 胺 澳這個(gè)函數(shù)定叭義在文件a辦rt/ru扒ntime把/thre拜ad.cc疤中。俺t。把 罷 Thr白ead類的翱成員函數(shù)F啊ullSu隘spend胺Check爸首先是調(diào)用靶成員函數(shù)T拔ransi伴tionF白romRu叭nnabl稗eToSuspend壩ed將自己骯從運(yùn)行狀態(tài)八修改為掛起安狀態(tài),接著霸再調(diào)用成員白函數(shù)Tra凹nsiti凹o(jì)nFro皚mSusp叭ended笆ToRun斑

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論