版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、凹ART運行癌時Comp扮actin百g GC為敗新創(chuàng)建對象氨分配內(nèi)存的爸過程分析笆在引進Co八mpact絆ing G拌C后,AR巴T運行時優(yōu)拜化了堆內(nèi)存八分配過程。矮最顯著特點班是為每個A伴RT運行時辦線程增加局頒部分配緩沖爸區(qū)(The霸ad Lo絆cal A懊llocation 哎Buffe板r)和在O岸OM前進行般一次同構(gòu)空藹間壓縮(H氨omoge埃neous案 Spac哀e Com拜pact)岸。前者可提啊高堆內(nèi)存分八配效率,后白者可解決內(nèi)扒存碎片問題笆。本文就對佰ART運行按時引進Co愛mpact半ing G般C后的堆內(nèi)伴存分配過程捌進行分析。叭從接口層面般上看,除了頒提供常規(guī)的耙對
2、象分配接哀口Allo胺cObje稗ct,AR吧T運行時的擺堆還提供了伴一個專門用靶于分配非移哀動對象的接暗口Allo按cNonM壩ovabl伴eObje巴ct,如圖矮1所示:辦h。捌非移動對象柏指的是保存昂在前面一篇辦文章提到的襖Non-M愛oving般 Spac霸e的對象,吧主要包括那唉些在類加載哀過程中創(chuàng)建笆的類對象(翱Class拌)、類方法艾對象(Ar啊tMeth芭od)和類版成員變量對瓣象(Art昂Field芭)等,以及哎那些在經(jīng)歷擺過若干次G艾enera芭tiona板l Sem埃i-Spa傲ce GC安之后仍然存半活的對象。哀前者是通過巴Alloc柏NonMo隘vable熬Objec
3、礙t接口分配案的,而后者矮是在執(zhí)行G拌enera靶tiona爸l Sem唉i-Spa傲ce GC笆過程移動過啊去的。本文佰主要關(guān)注通版過Allo佰cNonM稗ovabl疤eObje白ct接口分唉配的非移動靶對象。安g。扒 愛 無論是搬通過All扒ocObj啊ect接口案分配對象,白還是通過A阿llocN白onMov敖ableO耙bject凹接口分配對搬象,最后都板統(tǒng)一調(diào)用了胺另外一個接阿口Allo百cObje敖ctWit昂hAllo敗cator進行具體的埃分配過程,八如下所示:昂x。靶cpp阿 view扳 plai吧n cop芭y 在CO板DE上查看跋代碼片派生跋到我的代碼奧片啊u。扮clas
4、s班 Heap艾 百 publ版ic: 斑 .白. / 柏Alloc埃ates 岸and i熬nitia叭lizes捌 stor埃age f愛or an岸 obje安ct in按stanc敖e. 鞍Q。拜 tem斑plate埃 吧i。按 mir皚ror:熬Objec癌t* Al巴locOb暗ject(佰Threa暗d* se瓣lf, m芭irror胺:Cla安ss* k把lass,邦 size礙_t nu班m_byt拔es, 扒i。傲 叭 隘 扒 搬 凹 啊const半 PreF襖enceV扮isito昂r& pr懊e_fen壩ce_vi把sitor盎) 班H。岸 骯 SHAR懊ED_LO哎C
5、KS_R百EQUIR扒ED(Lo奧cks:骯mutat氨or_lo柏ck_) 伴 巴5。罷 r辦eturn氨 Allo爸cObje拔ctWit岸hAllo扒cator矮(sel笆f, kl芭ass, 扒num_b白ytes,鞍 哎q。盎 耙 阿 啊 跋 拌 板 翱 半 扮 爸 氨 GetCurre板ntAll按ocato唉r(), 澳 拜 岸 敗 佰 辦 安 稗 百 暗 埃 辦 絆 pre凹_fenc板e_vis盎itor)敗; 暗 tem把plate板 傲3。跋 mir壩ror:鞍Objec辦t* Al芭locNo懊nMova案bleOb靶ject(氨Threa藹d* se叭lf, m骯ir
6、ror哀:Cla扮ss* k半lass,俺 size罷_t nu芭m_byt矮es, 岸L。案 拜 霸 澳 啊 懊 皚 熬 稗const哎 PreF板enceV疤isito矮r& pr靶e_fen斑ce_vi阿sitor愛) 艾k。凹 挨 SHAR伴ED_LO把CKS_R扳EQUIR藹ED(Lo叭cks:皚mutat爸or_lo翱ck_) 扳 叭0。靶 r斑eturn埃 Allo矮cObje八ctWit埃hAllo埃cator翱(sel皚f, kl癌ass, 阿num_b安ytes,襖 壩z。版 邦 艾 百 扳 壩 笆 斑 爸 八 哀 捌 Get氨Curre扳ntNon百Movin罷gAllo
7、柏cator班(), 頒D。唉 阿 挨 哀 熬 巴 霸 敖 懊 翱 俺 哀 pre笆_fenc敖e_vis拌itor)傲; 礙 tem礙plate襖 按0。跋 ALW礙AYS_I笆NLINE扳 mirr板or:O襖bject昂* All奧ocObj耙ectWi岸thAll扒ocato百r( 熬3。愛 盎 Thre艾ad* s白elf, 班mirro絆r:Cl唉ass* 半klass凹, siz按e_t b靶yte_c捌ount,胺 Allo愛cator哎Type 跋alloc拔ator,吧 佰2。絆 啊 cons翱t Pre疤Fence埃Visit邦or& p靶re_fe骯nce_v爸isit
8、o半r) 氨R。白 版 SHAR安ED_LO暗CKS_R霸EQUIR鞍ED(Lo皚cks:疤mutat懊or_lo懊ck_);叭 扳3。 凹 All叭ocato擺rType擺 GetC笆urren捌tAllo疤cator盎() co艾nst 芭 稗3。埃 r把eturn邦 curr鞍ent_a唉lloca罷tor_;辦 唉 All叭ocato扒rType柏 GetC傲urren霸tNonM吧oving頒Alloc懊ator(霸) con捌st 伴 耙k。板 r哀eturn扒 curr壩ent_n澳on_mo頒ving_伴alloc按ator_凹; 絆p。 俺 .案. 扒 priv礙ate: 昂
9、 扒 .斑. 靶 / 俺Alloc埃ator 安type.伴 般 All哎ocato伴rType般 curr案ent_a埃lloca矮tor_;安 絆Y。疤 con疤st Al邦locat八orTyp凹e cur愛rent_傲non_m把oving襖_allo奧cator安_; 俺Q。 愛 .哎. ; 般 捌 岸這五個函數(shù)班定義在文件半art/r板untim埃e/gc/柏heap.癌h傲A。扒 礙 在He半ap類的成氨員函數(shù)Al翱locOb癌ject和埃Alloc笆NonMo邦vable愛Objec熬t中,參數(shù)八self描襖述的是當前翱線程,kl安ass描述埃的是要分配跋的對象所屬敗的類型,參
10、絆數(shù)num_埃bytes藹描述的是要哎分配的對象班的大小,最把后一個參數(shù)瓣pre_f擺ence_哎visit伴or是一個哎回調(diào)函數(shù),柏用來在分配哎對象完成后柏在當前執(zhí)行巴路徑中執(zhí)行昂初始化操作熬,例如分配扮完成一個數(shù)拜組對象,通拌過該回調(diào)函阿數(shù)立即設(shè)置唉數(shù)組的大小埃,這樣就可埃以保證數(shù)組拔對象的完整搬性和一致性礙,避免多線扳程環(huán)境下通稗過加鎖來完阿成相同的操翱作。敖L。擺 拌 Heap昂類的成員函阿數(shù)Allo瓣cObje背ctWit罷hAllo擺cator骯需要另外一岸個額外的類癌型為Allocato伴rType笆的參數(shù)來描啊述分配器的巴類型,也就拌是描述要在挨哪個空間分邦配對象。A扒lloc
11、a骯torTy艾pe是一個奧枚舉類型,跋它的定義如按下所示:耙t。斑cpp吧 view拔 plai霸n cop爸y 在CO百DE上查看盎代碼片派生絆到我的代碼扮片八W。壩/ Di凹ffere奧nt ty佰pes o佰f all澳ocato盎rs. 翱i。埃enum 耙Alloc澳atorT礙ype 扳 拌 kAl鞍l(fā)oc百atorT阿ypeBu把mpPoi稗nter,奧 / 笆Use B岸umpPo安inter柏 allo吧cator叭, has安 entr伴ypoin藹ts. H。佰 kAl吧locat襖orTyp跋eTLAB拔, /瓣 Use TLAB 版alloc半ator,佰 has
12、安entry傲point絆s. 熬8。矮 kAl絆locat阿orTyp扳eRosA藹lloc,拔 / 搬Use R唉osAll礙oc al澳locat搬or, h安as en絆trypo頒ints.瓣 胺r。般 kAl藹locat半orTyp拔eDlMa俺lloc,埃 / 鞍Use d岸lmall扳oc al安locat叭or, h班as en半trypo澳ints.壩 傲X。辦 kAl辦locat愛orTyp班eNonM埃oving頒, /藹 Spec耙ial a罷lloca靶tor f拌or no安n mov澳ing o翱bject叭s, do哎esnt拜 have板 entr艾ypoi
13、n班ts. 拜W。癌 kAl扮locat阿orTyp敖eLOS,佰 / 白Large矮 obje跋ct sp安ace, 稗also 埃doesn柏t ha埃ve en百trypo班ints.辦 拔E。; 隘 唉 罷這個枚舉類愛型定義在文耙件/art把/runt跋ime/g叭c/all哎ocato艾r_typ凹e.h。翱R。敖 頒 All鞍ocato扮rType愛一共有六個稗值,它們的斑含義如下所鞍示:邦 皚 kAl暗locat瓣orTyp伴eBump拜Point壩er:表示安在Bump耙 Poin捌ter S熬pace中擺分配對象。礙B。搬 埃 kAl跋locat絆orTyp埃eTLAB版:表
14、示要在哀由Bump隘 Poin熬ter S哀pace提拌供的線程局搬部分配緩沖扳區(qū)中分配對傲象。半h。辦 岸 kAl澳locat爸orTyp邦eRosA罷lloc:絆表示要在R八os Al隘l愛oc Sp頒ace分配吧對象。熬9。癌 kAl熬locat辦orTyp熬eDlMa暗lloc:安表示要在D背l Mal襖loc S按pace分百配對象。頒4。皚 哀 kAl傲locat襖orTyp般eNonM隘oving埃:表示要在吧Non M盎oving頒 Spac唉e分配對象愛。扒V。壩 翱 kAl盎locat奧orTyp搬eLOS:澳表示要在L矮arge 板Objec拜t Spa背ce分配對澳象。
15、瓣W。稗 案 Hea伴p類的成員盎函數(shù)All扳ocObj叭ect和A跋llocN瓣onMov敖ableO捌bject哀使用的分配版器類型分別骯是由成員變佰量curr埃ent邦_allo安cator辦_和cur皚rent_哀non_m安oving埃_allo俺cator暗_決定的。邦前者的值與傲當前使用的奧GC類型有爸關(guān)。當GC笆類型發(fā)生變白化時,就會安調(diào)用Hea白p類的成員般函數(shù)Cha唉ngeCo案llect巴or來修改俺當前使用的皚GC,同時耙也會調(diào)用另胺外一個成員斑函數(shù)Cha唉ngeAl案locat礙or來修改骯Heap類芭的成員變量藹curre哀nt_al奧locat愛or_的值壩。由于
16、AR搬T運行時只扮有一個No敖n-Mov柏ing S哎pace,頒因此后者的艾值就固定為奧kAllo懊cator稗TypeN熬onMov背ing。霸9。擺 爸 Hea拜p類的成員霸函數(shù)Cha絆ngeCo靶l(wèi)lect氨or的實現(xiàn)八如下所示:壩x。岸cpp扮 view爸 plai隘n cop柏y 在CO頒DE上查看暗代碼片派生瓣到我的代碼挨片叭8。凹void 霸Heap:跋:Chan瓣geCol哀lecto把r(Col盎lecto敗rType把 coll絆ector拜_type拔) 八0。皚 / 疤TODO:埃 Only翱 do t靶his w哎ith a岸ll mu盎tator岸s sus敖pe
17、nde拌d to 巴avoid跋 race岸s. 辦b。拔 if 扮(coll氨ector拜_type霸 != c澳ollec艾tor_t骯ype_)扮 唉I。埃 .耙.板 靶 艾 c暗ollector_t背ype_ 柏= col板lecto矮r_typ敗e; 爸B。暗 g辦c_pla耙n_.cl昂ear()胺; 八 s按witch鞍 (col跋lecto跋r_typ愛e_) 吧 叭 骯 case kCol百lecto唉rType隘CC: 百/ Fa鞍l(fā)l-th懊rough把. 鞍m。敗 搬 case癌 kCol拔lecto凹rType笆MC: 芭/ Fa骯ll-th把rough案. 霸a。熬
18、 罷 case啊 kCollecto百rType柏SS: 吧/ Fa百ll-th般rough般. 埃2。班 case爸 kCol柏lecto矮rType扒GSS: 吧 按 哎 gc百_plan氨_.pus罷h_bac霸k(col邦lecto扳r:kG背cType艾F(xiàn)ull)巴; 瓣d。把 跋 if澳 (use佰_tlab矮_) 耙 藹 班 胺Chang頒eAllo案cator啊(kAll啊ocato翱rType白TLAB); 敖0。凹 板 稗else 愛 半 叭Chang板eAllo哎cator版(kAll啊ocato挨rType靶BumpP暗ointe隘r); 斑a。俺 埃 稗 皚 巴 br
19、埃eak; 稗 骯 柏 背 case白 kCol艾lecto巴rType疤MS: 癌 靶 疤 gc頒_plan捌_.pus絆h_bac頒k(col拌lecto鞍r:kG辦cType埃Stick八y); 板O。爸 耙 gc皚_plan阿_.pus挨h_bac搬k(col笆lecto唉r:kG啊cType扮Parti般al); 辦 扒F。芭 昂 gc鞍_plan隘_.pus埃h_bac敖k(col芭lecto百r:kG霸cType爸Full)敖; 疤O。頒 霸 Ch隘angeA愛lloca哀tor(k疤UseRo罷sAllo胺c ? k哎Alloc般atorT叭ypeRo啊sAllo隘c : k骯
20、Alloc胺atorT鞍ypeDl扮Mallo佰c); 挨7。罷 岸 br傲eak; 澳 愛 八 敗 案 case拔 kCol隘lecto襖rType稗CMS: 昂 擺 隘 gc把_plan伴_.pus擺h_bac拜k(col耙lecto霸r:kG盎cType絆Stick懊y); 吧H。哀 斑 gc哎_plan扮_.pus敖h_bac八k(col板lecto鞍r:kG翱cType礙Parti背al); 翱 骯m。靶 俺 gc稗_plan昂_.pus八h_bac瓣k(col般lecto班r:kG八cType邦Full)阿; 凹U。壩 翱 Ch稗angeA擺lloca背tor(k阿UseRo把sA
21、llo盎c ? k班Alloc俺atorT半ypeRo皚sAllo班c : k疤Alloc矮atorT拌ypeDl巴Mallo八c); 敗3。案 暗 br隘eak; 翱 班 靶 暗 斑 defa癌ult: 隘 案 爸 LO壩G(FAT拔AL) 拜 Un把imple背mente隘d; 俺 霸 暗 盎 藹 .艾.白 稗 氨 這個函頒數(shù)定義在文稗件im半e/gc/壩heap.俺cc中。瓣 佰 從這里頒我們就可以斑看到,對于霸Compa斑cting笆 GC,它襖們使用的分扮配器類型只挨可能為kA哎lloca版torTy襖peTLA板B或者kA俺lloca伴torTy岸peBum疤pPoin昂ter,取
22、懊決定Hea艾p類的成員礙變量use拌_tlab捌_的值。H哎eap類的奧成員變量u哎se_tl半ab_的值盎默認為fa暗lse,但礙是可以通過熬ART運行隘時啟動選項癌-XX:U叭seTLA藹B來設(shè)置為案true。礙對于Mar藹k-Swe懊ep GC昂來說,它們翱使用的分配挨器類型只可跋能為kAl隘locat暗orTyp拜eRosA般lloc或阿者懊kAllo絆cator皚TypeD邦lMall俺oc,取決叭于常量kU傲seRos板Alloc艾的值。半k。白 礙 此外,盎我們還可以扳看到,根據(jù)案當前使用的敗GC不同,爸Heap類胺的成員變量般gc_pl芭an_會被拌設(shè)置為不同唉的值,用來白表
23、示在分配壩對象過程中愛遇到內(nèi)存不啊足時,應該敖執(zhí)行的GC凹粒度。對于爸Compa唉cting哀 GC來說艾,只有一種搬GC粒度可拔執(zhí)行,那就把是kGcT擺ypeFu熬ll,實際稗上就是說對按Bump 愛Point耙er Sp岸ace的所斑有不可達對胺象進行回收傲。對于Ma辦rk-Sw熬eep G藹C來說,有骯三種GC粒昂度可執(zhí)行,百分別是kG霸cType拌S襖ticky扮、kGcT跋ypePa癌rtial拌和kGcT俺ypeFu扮ll。這三白者的含義可百以參考前面鞍一文。后面盎我們繼續(xù)對稗象分配過程哀時,也可以皚看到Hea百p類的成員辦變量gc_把plan_哎的用途。翱7。翱 笆 Hea捌p類
24、的成員壩函數(shù)Cha笆ngeAl哀locat半or的實現(xiàn)巴如下所示:叭q。熬cpp拜 view邦 plai罷n cop霸y 在CO巴DE上查看拜代碼片派生跋到我的代碼昂片邦V。斑void 懊Heap:壩:Chan皚geAll邦ocato盎r(All愛ocato翱rType百 allo把cator斑) 斑n。百 if 熬(curr頒ent_a岸lloca敗tor_ 吧!= al跋locat捌or) 罷 按R。皚 .案.癌 邦 c唉urren盎t_all皚ocato埃r_ = 擺alloc哀ator;版 跋n。唉 M鞍utexL辦ock m拌u(nul熬lptr,爸 *Loc隘ks:r伴untim疤
25、e_shu頒tdown拌_lock拌_); 熬K。搬 S耙etQui骯ckAll爸ocEnt哀ryPointsAl伴locat百or(cu伴rrent矮_allo邦cator胺_); 瓣z。暗 .暗.骯 拔 胺 這個函岸數(shù)定義在文百件ime/癌gc/he八ap.cc唉中。骯 百 He絆ap類的成芭員函數(shù)Ch敗angeA案lloca按tor除了凹設(shè)置成員變擺量curr芭ent_a胺lloca擺tor_的霸值之外,還班會調(diào)用函數(shù)扒SetQu頒ickAl敖locEn骯tryPo奧intsA半lloca把tor來修佰改提供給N俺ative跋 Code安的用來分配案對象的入口邦點函數(shù),以愛便Nati耙v
26、e Co隘de可以在拌ART運行敗時切換GC班時使用正常辦的接口來分吧配對象。這伴里所謂的N凹ative安 Code盎,就是AP百K在安裝時罷通過翻譯D敖EX字節(jié)碼鞍得到的本地爸機器指令。柏D。胺 佰 了解了拜分配器的類捌型之后,接澳下來我們就癌繼續(xù)分析H凹eap類的成員函數(shù)A骯lloc疤Objec扒tWith敖Alloc愛ator的吧實現(xiàn),如下芭所示:熬4。捌cpp懊 view捌 plai哀n cop骯y 在CO百DE上查看奧代碼片派生吧到我的代碼板片埃E。熬templ罷ate 瓣 胺Z。懊inlin霸e mir壩ror:氨O(jiān)bjec扮t* He佰ap:A埃llocO熬bject哎WithA
27、把lloca胺tor(T澳hread靶* sel擺f, mi阿rror:笆:Clas靶s* kl按ass, 阿 愛B。般 罷 傲 柏 安 奧 案 擺 罷 氨 叭 s礙ize_t頒 byte扮_coun熬t, Al暗locat笆orTyp挨e all半ocato扒r, 跋9。般 霸 暗 唉 氨 皚 柏 班 安 頒 骯 c礙onst 矮PreFe傲nceVi版sitor癌& pre隘_fenc扳e_vis俺itor)隘 愛a。案 .拜. 吧 if 礙(kChe凹ckLar安geObj柏ect &案& UNL傲IKELY靶(ShouldAll俺ocLar笆geObj爸ect(k骯lass,敗 byt
28、e罷_coun傲t) 襖 班5。稗 r奧eturn懊 Allo拌cLarg奧eObje啊ct(半self,澳 klas熬s, by鞍te_co啊unt, 擺 捌p。埃 敖 艾 癌 佰 背 襖 傲 襖 耙 板 唉 霸pre_f芭ence_皚visit矮or); 澳 佰 mir邦ror:埃Objec把t* ob胺j; .艾. 拔 if 班(allo暗cator襖 = k背Alloc靶atorT背ypeTL皚AB) 拌 罷I。翱 b霸yte_c版ount 挨= Rou拌ndUp(阿byte_半count鞍, spa疤ce:B扳umpPo笆inter藹Space熬:kAl暗ignme熬nt); 熬 百
29、r。 礙 if 鞍(allo矮cator啊 = k傲Alloc阿atorT版ypeTL背AB &敗 byte搬_coun癌t Tlab搬Size(襖) 般 把o。鞍 o艾bj = 笆self-扒Allo瓣cTlab斑(byte背_coun稗t); 襖N。壩 .哎.絆 班 o靶bj-S絆etCla癌ss(kl挨ass);啊 稗 .傲.懊 隘 p矮re_fe班nce_v霸isito艾r(obj耙, usa芭ble_s岸ize);襖 f。佰 .般.班 罷 e癌lse 罷 翱 o襖bj = 襖TryTo斑Alloc百ate半(self敗, all愛ocato挨r, by阿te_co八unt, 罷&by
30、te扮s_all敖ocate柏d, 把c。啊 襖 岸 班 岸 稗 哎 凹 版 盎 &usa骯ble_s昂ize);擺 安 i熬f (UN捌LIKEL癌Y(obj笆 = n唉ullpt皚r) 背 案h。阿 翱 bool胺 is_c辦urren佰t_all暗ocato凹r = a挨lloca哀tor =邦= Get昂Curre佰ntAll扮ocato氨r(); 版 胺U。矮 懊 obj 挨= All吧ocate啊Inter半nalWi胺thGc(岸self,霸 allo藹cator般, byt斑e_cou拜nt, &疤bytes捌_allo熬cated斑, &us按able_捌size,骯 啊4。
31、岸 矮 半 敗 隘 搬 敗 耙&klass); 班 吧 if (挨obj =擺= nul柏lptr)敖 按 懊 bo擺ol af盎ter_i哎s_cur斑rent_澳alloc頒ator 扒= all絆ocato藹r = 罷GetCu襖rrent瓣Alloc懊ator(藹); c。唉 拌 /半 If t叭here 拜is a 靶pendi傲ng ex矮cepti懊on, f叭ail t傲he al疤locat耙ion r靶ight 澳away 擺since柏 the 阿next 拌one 絆w。疤 搬 /版 coul邦d cau敗se OO邦M and暗 abor爸t the扮 runt捌im
32、e. 埃 藹F。般 襖 if拔 (!se阿lf-I頒sExce澳ption敖Pendi八ng() 耙& is暗_curr板ent_a案lloca般tor &白& !af岸ter_i皚s_cur叭rent_艾alloc拜ator)芭 瓣n。罷 白 吧/ If辦 the 靶alloc白ator 罷chang板ed, w捌e nee捌d to 埃resta矮rt th懊e all半ocati藹on. 敖L。巴 擺 傲retur案n All辦ocObj拌ect(s暗elf, 安klass隘, byt般e_cou按nt, p氨re_fe罷nce_v襖isito暗r); 澳1。擺 扳 盎 邦 氨 re搬t(yī)
33、urn 唉nullp熬tr; 愛 霸 白 罷 斑 .爸.阿 藹 o壩bj-S敗etCla隘ss(kl稗ass);傲 氨 .拜.案 絆 p俺re_fe隘nce_v翱isito百r(obj邦, usa辦ble_s巴ize);拌 版S。擺 .般.凹 昂 .拌. 扒 if 敗(Allo俺cator藹HasAl跋locat巴ionSt啊ack(a鞍l(fā)loca岸tor)啊 頒D。叭 P吧ushOn唉Alloc挨ation懊Stack皚(self爸, &ob藹j); 隘H。 按 .愛. 板 if 耙(Allo拌cator板MayHa版veCon白curre絆ntGC(昂alloc唉ator)澳 & I捌sG
34、cCo班ncurr半ent()啊) 岸m。骯 C笆heckC艾oncur笆rentG暗C(sel八f, ne扒w_num氨_byte盎s_all稗ocate案d, &o霸bj); 拜 皚6。 氨 .拜. 靶 ret艾urn o傲bj; 搬 斑 這個函伴數(shù)定義在文哎件art/矮runti皚me/gc安/heap暗-inl.岸h中。敗F。笆 哎 Hea瓣p類的成員傲函數(shù)All鞍ocObj板ectWi昂thAll辦ocato拔r分配對象捌的主要邏輯斑如圖2所示岸:昂I。凹首先,如果跋模板參數(shù)k拌Check吧Large扳Objec艾t等于tr白ue,并且板要分配的是敗一個原子類白型數(shù)組,且白該為數(shù)組的
35、敗大小大于預氨先設(shè)置的值凹,那么忽略懊掉參數(shù)al熬locat辦or,而是白調(diào)用Hea敗p類的另外一個成員函安數(shù)Allo白cLarg奧eObje奧ct直接在擺Large愛 Obje巴ct Sp八ace中分頒配內(nèi)存。后靶一個條件是扮通過調(diào)用H案eap類的百成員函數(shù)S捌hould捌Alloc氨Large阿Objec疤t來判斷是骯否滿足的,絆它的實現(xiàn)如八下所示:傲z。白cpp埃 view骯 plai斑n cop癌y 在CO背DE上查看跋代碼片派生扒到我的代碼巴片頒k。傲inlin板e boo背l Hea頒p:Sh氨ouldA耙llocL絆argeO岸bject藹(mirr稗or:C霸lass*靶 c,
36、 s壩ize_t氨 byte八_coun鞍t) co頒nst 霸 叭R。半 / 艾We ne爸ed to伴 have埃 a zy隘gote 哎space愛 or e挨lse o罷ur ne岸wly a邦lloca皚ted l暗arge 澳objec熬t can凹 end 般up in八 the 氨 凹x。半 / 藹Zygot矮e res熬ulti版ng in靶 it b跋eing 安prema扳turel暗y fre瓣ed. 鞍5。扒 / 百We ca骯n onl半y do 隘this 澳for p拌rimit癌ive o哀bject癌s sin熬ce la壩rge o八bject絆s wil
37、皚l not扳 be w吧ithin搬 the 邦card 扒table柏 拌W。板 / 傲range安. Thi氨s als跋o mea捌ns th艾at we佰 rely艾 on S般etCla擺ss no襖t dir頒tying班 the 藹objec阿ts c岸ard. 案 礙8。疤 ret奧urn b安yte_c搬ount 鞍= la鞍rge_o奧bject柏_thre扒shold艾_ & 百c-Is扮Primi胺tiveA罷rray(背); 哎f。 翱 俺 班這個函數(shù)定搬義在文件a巴rt/ru按ntime埃/gc/h翱eap-i班nl.h中柏。鞍e。奧 扳 Hea扳p類的成員埃變量
38、lar懊ge_ob吧ject_襖thres半hold_擺初始化為k吧Defau盎ltLar壩geObj八ectTh邦resho礙ld,后者昂又定義為3背個內(nèi)存頁大骯小。也就是襖說,當分配啊的原子類型叭數(shù)組大小大叭于等于3個霸內(nèi)存頁時,芭就在Lar八ge Ob絆ject 俺Space昂中進行分配壩。半4。背 敗 回到H笆eap類的罷成員All唉ocObj般ectWi壩thAll叭ocato笆r中,如果佰指定了要在半當前ART柏運行時線程氨的TLAB扮中分配對象拌,并且這時礙候當前AR胺T運行時線跋程的TLA皚B的剩余大百小大于請求傲分配的對象扒大小,那么骯就直接在當隘前線程的T挨LAB中分瓣配。
39、ART跋運行時線程敖的TLAB爸實際上是來按自于Bum鞍p Poi翱nter 頒Space氨上的,后面昂我們就可以霸看到這一點扒。頒K。笆 擺 如果上搬面的條件都傲不成立,接絆下來就調(diào)用瓣Heap類鞍的成員函數(shù)啊TryTo搬Alloc骯ate來進按行分配了。霸Heap類叭的成員函數(shù)巴TryTo爸Alloc襖ate會根頒據(jù)參數(shù)al拜locat擺or,在指愛定的Spa擺ce分配內(nèi)捌存,同時會澳根據(jù)第二個礙模板參數(shù)來啊決定是否要澳在允許的范拜圍內(nèi)增加S盎pace的巴大小限制,般以便可以滿佰足分配要求藹。這里指定耙Heap類辦的成員函數(shù)氨TryTo氨Alloc扮ate的值班為fals半e,就表示背現(xiàn)在
40、在不增邦長Spac胺e的大小限斑制的前提下斑為對象分配捌內(nèi)存。稗k。背 芭 如果H霸eap類的疤成員函數(shù)T叭ryToA絆lloca隘te不能成岸功分配到指班定大小的內(nèi)巴存,那么就昂需要調(diào)用H盎eap類的骯成員函數(shù)A稗lloca疤teInternal鞍WithG皚c來先執(zhí)行按必要的GC皚,再嘗試分笆配請求的內(nèi)扮存了。拔D。笆 唉 如果H吧eap類的傲成員函數(shù)A翱lloca把teInt邦ernal隘WithG挨c也不能成礙功分配到內(nèi)哎存,那就表八明是分配失氨敗了。不過爸有一個例外罷,那就是A拌RT運行時藹當前使用分版配器類型發(fā)隘生了變化,昂這種情況就芭需要重新調(diào)斑用Heap罷類的成員函襖數(shù)Allo
41、澳cObje扒ct重啟分背配過程。從半上面的分析版可以知道,絆當ART運巴行時當前使捌用的GC發(fā)骯生切換時,把ART運行罷時當前使用鞍的分配器類案型也會隨著礙變化,因此辦這時候重新擺調(diào)用Hea凹p類的成員靶函數(shù)All叭ocObj般ect,就矮可以使用當巴前的分配器埃來分配對象奧。版q。澳 辦 假設(shè)前癌面成功分配叭了到指定的皚內(nèi)存,接下唉來還有兩件鞍事情需要做凹。笆 癌 第一件熬事情是調(diào)用骯Heap類唉的成員函數(shù)半Alloc挨atorH盎asAll背ocati昂onSta奧ck判斷參罷數(shù)allo俺cator百指定的分配班器是否與A壩RT運行時斑的Allo藹catio藹n Sta藹ck有關(guān)。暗如果
42、有關(guān)的跋話,那么就拌需要將剛才挨成功分配到癌的對象通過翱調(diào)用Hea邦p類的成員柏函數(shù)Pus瓣hOnAl傲locat奧ionSt稗ack壓入傲到ART運背行時的Al疤locat襖ion S埃tack中唉,以便以后疤可以執(zhí)行S埃ticky矮 GC。關(guān)擺于Stic隘ky GC佰,可以參考癌前面一文。疤m。頒 唉 Hea澳p類的成員哎函數(shù)All邦ocato傲rHasA跋lloca柏tionS霸tack的奧實現(xiàn)如下所半示:八e。敗cpp般 view把 plai傲n cop胺y 在CO奧DE上查看伴代碼片派生啊到我的代碼芭片靶s。皚class凹 Heap敗 跋 publ奧ic: 埃 .罷. 版 sta翱t
43、ic A扒LWAYS敖_INLI安NE bo愛ol Al敗locat翱orHas挨Alloc皚ation捌Stack百(Allo隘cator擺Type 唉alloc班ator_爸type)班 骯l。罷 r埃eturn埃 拜 辦 al敗locator_ty岸pe !=巴 kAll哀ocato鞍rType班BumpP柏ointe吧r & 邦 埃Z。安 熬 al隘locat辦or_ty氨pe !=般 kAll敗ocato八rTyp哎eTLAB傲; 霸r。 拔 .皚. ; 稗 罷 這個函啊數(shù)定義在文耙件art/擺runti挨me/gc把/heap.h中。八W。半 矮 前面提胺到,ART俺運行時線程辦的
44、TLAB皚是來自于B罷ump P安ointe靶r Spa案ce的,而把Bump 頒Point百er Sp扳ace是與氨Compa矮cting頒 GC相關(guān)懊的,All辦ocati跋on St奧ack是與班Stick壩y GC相挨關(guān)的,這就般意味著Co瓣mpact耙ing GC不會執(zhí)行半Stick熬y類型的G胺C。柏X。柏 罷 第二件俺事情是調(diào)用柏Heap類昂的成員函數(shù)版All吧ocato稗r(nóng)MayH把aveCo邦ncurr八entGC盎判斷參數(shù)a擺lloca稗tor指定的分配器是皚否與Con瓣curre絆nt GC隘相關(guān),并且奧當前使用的靶GC就是一鞍個Conc隘urren挨t GC。絆如果條件
45、都礙成立的話,案就調(diào)用He跋ap類的成昂員函數(shù)Ch敖eckCo埃ncurr跋entGC般檢查是否需搬要發(fā)起一個礙Concu稗r(nóng)rent擺 GC請求扮。皚w。稗 挨 Hea百p類的成員哎函數(shù)All骯ocato百rMayH案aveCo叭ncurr爸entGC按的實現(xiàn)如下翱所示:盎0。哀cpp翱 view斑 plai耙n cop絆y 在CO艾DE上查看拜代碼片派生百到我的代碼柏片埃0。敗c唉lass 哎Heap 叭 唉 publ疤ic: 般 .懊. 班 sta哀tic A拔LWAYS鞍_INLI叭NE bo耙ol Al罷locat捌orMay胺HaveC搬oncur懊rentG胺C(All辦ocat
46、o埃rType暗 allo吧cator笆_type扳) 暗7。霸 r敗eturn敗 Allo把cator隘HasAl扮locat按ionSt骯ack(a扮lloca把tor_t敗ype);隘 癌S。 俺 .版. ; 八 版 這個搬函數(shù)定義在白文件art懊/runt八ime/g暗c/hea安p.h中。芭9。敗 耙 啊 Heap扳類的成員函翱數(shù)Allo襖cator斑MayHa安veCon昂curre骯ntGC的藹判斷邏輯與霸上面分析的挨成員函數(shù)A辦lloca岸torHa愛sAllo奧catio靶nStac霸k是一樣的哎,這就意味白著目前提供爸的Comp拜actin礙g GC都阿是非Con氨curr
47、e壩nt的。不氨過以后是會吧提供具有C霸oncur昂rent功岸能的Com捌pacti隘ng GC版的,稱為C巴oncur版rent 懊Copyi瓣ng GC叭。扳K。癌 半 以上就矮是Heap艾類的成員函氨數(shù)Allo扳cObje按ctWit懊hAllo案cator盎的實現(xiàn),接阿下來我們繼艾續(xù)分析He般ap類的成矮員函數(shù)Tr瓣yToAl案locat百e和All啊ocate昂Inter板nalWi拜thGc的頒實現(xiàn),以便鞍可以更好地挨了解ART笆運行時分配傲對象的過程盎。這也有利耙用我們后面啊分析ART絆運行時的C靶ompac巴ting 熬GC的執(zhí)行岸過程。拔I。俺 百 Hea昂p類的成員暗函數(shù)
48、Try安ToAll般ocate挨的實現(xiàn)如下岸所示:班e。盎cpp骯 view搬 plai唉n cop八y 在CO阿DE上查看翱代碼片派生矮到我的代碼暗片靶3。翱templ氨ate 扳W。襖inlin敗e mir百r傲or:O伴bject鞍* Hea拜p:Tr疤yToAl靶l(wèi)ocat奧e(Thr靶ead* 挨self,叭 Allo愛cator胺Type 跋alloc邦ator_佰type,暗 瓣p。辦 哎 霸 版 凹 安 埃 鞍 辦 si爸ze_t 巴alloc拔_size吧, siz挨e_t* 凹bytes白_allo癌cated搬, 般V。稗 白 隘 拜 唉 斑 爸 板 阿 si俺ze_t*
49、胺 usab扳le_si霸ze) 班 翱 if 半(allo靶cator稗_type疤 != k壩Alloc哎atorT礙ypeTL癌AB &疤 搬d。擺 熬 UNLI叭KELY(爸IsOut扮OfMem笆oryOn阿Alloc拜ation絆(al敖locat岸or_ty盎pe, a奧lloc_盎size)巴) 俺 罷8。懊 r岸eturn扒 null搬ptr; 吧 靶 mir擺ror:俺Objec爸t* re俺t; 伴 swi扮tch (挨alloc阿ator_傲type)奧 瓣 c般ase k扒Alloc佰atorT熬ypeBu凹mpPoi骯nter:斑 跋Q。矮 哀 DCHE哎CK(bu
50、愛mp_po矮inter襖_spac胺e_ !=靶 null八ptr);挨 扳P。鞍 扮 allo骯c_siz把e = R艾oundU擺p(all半oc_si敖ze, s半pace:爸:Bump耙Point隘erSpa罷ce:k昂Align搬ment)翱; 拌g。俺 胺 ret 氨= bum懊p_poi霸nter_艾space隘_-Al把locNo凹nvirt罷ual(a昂lloc_斑size)敖; 埃u。白 背 if (背LIKEL鞍Y(ret阿 != n敗ullpt絆r) 邦 襖 盎 *b扮ytes_拔alloc拌ated 扳= all藹oc_si鞍ze; 扳 骯 *u柏sable艾_si
51、ze辦 = al笆loc_s背ize; 背 挨 俺 笆 矮 brea鞍k; 隘 八 癌 c靶ase k襖Alloc拜atorT邦ypeRo藹sAllo霸c: 捌 柏 芭 if (爸kInst拜rumen板ted &佰& UNL斑IKELY稗(runn吧ing_o爸n_val愛grind凹_) 安 拌D。拔 瓣 /芭 If r暗unnin凹g on 半valgr罷ind, 礙we sh頒ould 班be us礙ing t班he in半strum罷ented岸 path皚. 凹o。阿 骯 re斑t = r擺osall版oc_sp稗ace_-胺Allo捌c(sel岸f, al芭loc_s昂ize,
52、霸bytes八_allo班cated佰, usa耙ble_s版ize);襖 u。班 捌 el癌se 柏 吧 礙 DC佰HECK(吧!runn隘ing_o翱n_val癌grind絆_); 絆 拔 re安t = r班osall襖oc_sp巴ace_-盎Allo扮cNonv盎irtua耙l(sel啊f, al敗loc_s案ize, 把bytes唉_allo靶cated胺, usa拜ble_s案ize);搬 昂3。俺 懊 靶 八 brea芭k; 笆 伴 罷 c辦ase k絆Alloc礙atorT瓣ypeDl阿Mallo耙c: 敖 扳 稗 if (唉kInst芭rumen板ted &皚& UNL絆IKE
53、LY佰(runn柏ing_o百n_val藹grind跋_) 阿 背0。芭 皚 /擺 If r白unnin暗g on 巴valgr白ind, 柏we sh俺ould 頒be us拔ing t扮he in巴strum靶ented吧 path擺. 班6。案 扳 re疤t = d敗lmall般oc_sp矮ace_-爸Allo敖c(sel胺f, al百loc_s暗ize, 板bytes皚_allo氨cated翱, usa跋ble_s爸ize);辦 翱p。唉 襖 el拔se 傲 挨 澳 DC礙HECK(澳!runn拌ing_o斑n_val艾grind哀_); 板 百 re搬t(yī) = d頒lmall巴oc_s
54、p巴ace_-扒Allo案cNonv隘irtua骯l(sel敗f, al奧loc_s笆ize, 奧bytes俺_allo癌cated矮, usa哀ble_s襖ize);啊 俺v。柏 奧 扮 brea拌k; 澳 跋 岸 c敖ase k挨Alloc罷atorT扳ypeNo柏nMovi罷ng: 昂 靶r。扳 鞍 ret 佰= non敖_movi靶ng_sp盎ace_-俺Allo爸c(sel班f, al扮loc_s哀ize, 般bytes背_allo斑cated傲, usa昂ble_s霸ize);百 挨B。皚 吧 brea骯k; 笆 暗 笆 c叭ase k挨Alloc拜atorT鞍ypeLO扳S: 班
55、 凹 唉 ret 背= lar熬ge_ob斑ject_班space_-Al伴loc(s哎elf, 百alloc壩_size芭, byt襖es_al愛locat艾ed, u吧sable胺_size藹); 暗X。八 熬 / N靶ote t斑hat t安he bu跋mp po跋inter笆 spac藹es ar芭ent 絆neces稗saril哎y nex俺t to 捌 哀0。安 芭 / t阿he ot佰her c岸ontin隘uous 澳space靶s lik隘e the敗 non-凹movin鞍g all澳oc sp般ace o辦r 疤A。唉 埃 / t挨he zy奧gote 百space柏.
56、礙 懊 DCHE俺CK(re暗t = 耙nullp昂tr |胺 larg扒e_obj挨ect_s版pace_版-Con挨tains柏(ret)疤); 笆q。佰 艾 brea耙k; 挨 佰 矮 c吧ase k襖Alloc鞍atorT斑ypeTL昂AB: 芭 愛 癌 DCHE矮CK_AL版IGNED捌(allo艾c_siz拜e, sp胺ace:奧BumpP捌ointe吧rSpac盎e:kA隘lignm哀ent);八 熬5。耙 背 if (昂UNLIK白ELY(s巴elf-唉TlabS唉ize()埃 al斑loc_s扒ize)霸 版8。版 啊 co拜nst s敗ize_t案 new_矮tlab_鞍s
57、ize 絆= all白oc_si佰ze + 熬kDefa罷ultTL吧ABSiz拜e; 氨j。板 八 if阿 (UNL叭IKELY八(IsOu芭tOfMe骯moryO癌nAllo擺catio伴n(a瓣lloca艾tor_t凹ype, 瓣new_t板lab_s暗ize)啊) 版j。矮 癌 叭retur暗n nul笆lptr;安 背 礙 芭 爸 吧 /翱 Try 壩alloc霸ating敗 a ne絆w thr頒ead l哎ocal 岸buffe唉r, if芭 the 奧alloc巴aiton氨 fail鞍s the阿 spac埃e mus佰t be 敖 佰2。吧 把 /敖 full斑 so r伴
58、eturn氨 null岸ptr. 壩 捌 拔 if哀 (!bu背mp_po按inter癌_spac哀e_-A柏llocN隘ewTla隘b(sel鞍f, ne愛w_tla鞍b_siz芭e) 擺 礙4。捌 拜 案retur白n nul愛lptr;跋 罷 唉 吧 岸 挨 *b靶ytes_頒alloc按ated 矮= new八_tlab哀_size皚; 昂J。扮 哀 el把se 佰 暗 岸 *b疤ytes_辦alloc拔ated 稗= 0; 霸 巴 白 白 拜 / T昂he al白locat把ion c昂ant 敗fail.百 岸 般 ret 拔= sel霸f-Al癌locTl癌ab(al板loc_s
59、疤ize);襖 安9。胺 吧 DCHE板CK(re般t != 搬nullp半tr); 霸 襖 班 *usa絆ble_s笆ize =隘 allo笆c_siz埃e; 熬 八 brea壩k; 搬 斑 胺 d胺efaul礙t: 壩 啊 百 LOG(熬FATAL瓣) Se叭tTlab斑(star皚t, st瓣art +翱 byte皚s); 艾y。案 ret版urn t阿rue; 哎 扳 把 這個函巴數(shù)定義在文笆件art/壩runti芭me/gc百/spac笆e/bum版p_poi懊nter_靶space芭.cc中。挨D。俺 叭 Bum班pPoin愛terSp捌ace類的爸成員函數(shù)A耙llocN罷ewTl
60、a案b首先是調(diào)扒用成員函數(shù)翱Revok挨eThre岸adLoc藹alBuf敗fersL岸ocked骯撤銷當前A般RT運行時跋線程的TL吧AB,因為版之前可能給奧它分配過T班LAB,接翱著再調(diào)用成挨員函數(shù)Al耙locBl襖ock在B靶ump P氨ointe邦r Spa拔ce中分配襖一塊由參數(shù)吧bytes懊指定的內(nèi)存捌塊,并且調(diào)阿用Thre唉ad類的成暗員函數(shù)Se藹tTlab斑將該內(nèi)存塊懊設(shè)置為當前霸ART運行拔時線程新的八TLAB。白接下來我們哀就繼續(xù)分析搬上述三個函翱數(shù)的實現(xiàn)。埃w。瓣 稗 Bum礙pPoin敗terSp骯ace類的挨成員函數(shù)R鞍evoke背Threa澳dLoca耙lBuff壩
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度戶外廣告牌租賃與戶外LED廣告內(nèi)容制作合同2篇
- 二零二五年度存量房買賣合同4篇
- 2024私車公用合同
- 2025年度油氣田打井設(shè)備租賃合同8篇
- 2025年度南京市個人旅游線路開發(fā)合同3篇
- 2025年度參展合同模板:5G通信技術(shù)應用展合作協(xié)議3篇
- 2025蝦苗養(yǎng)殖基地產(chǎn)學研一體化合同協(xié)議3篇
- 二零二五年度幕墻施工安全教育培訓合同
- 二零二五年度門衛(wèi)室通風系統(tǒng)施工合同4篇
- 二零二五年度張偉與王芳離婚后子女監(jiān)護權(quán)及撫養(yǎng)費支付合同4篇
- 2024年四川省成都市龍泉驛區(qū)中考數(shù)學二診試卷(含答案)
- 護理飲食指導整改措施及方案
- 項目工地春節(jié)放假安排及安全措施
- 印染廠安全培訓課件
- 紅色主題研學課程設(shè)計
- 胸外科手術(shù)圍手術(shù)期處理
- 裝置自動控制的先進性說明
- 《企業(yè)管理課件:團隊管理知識點詳解PPT》
- 移動商務內(nèi)容運營(吳洪貴)任務二 軟文的寫作
- 英語詞匯教學中落實英語學科核心素養(yǎng)
- 《插畫設(shè)計》課程標準
評論
0/150
提交評論