際際滷

際際滷Share a Scribd company logo
dalvik の GC をのぞいてみた @akachochin
徭失B初 兆念@akachochin
蝶メ`カ`で珂酷永やプリンタに稼艶岳恢壊糸な或皆を怏みzんで、咬み旗借いでいるひと。
どうにかこうにか、コ`ディング根めた蝕k匍暦にありつけています。
箸龍は兆念のとおり、橿戻菊めぐり。
魁挑の廚瀘檗△気い芥`。
書指GCをxんだわけ H氏でうっかり仝じゃあ、爰ってみようかな々と笥恠ったから(丶)
ネタ冥しでWeb Pageみてたら仝2.3からコンカレントGCをサポ`ト々といてあった。
もともと或皆塁でメモリ砿尖まわりは佶龍があった。
こうしたわけで、コンカレント赫遺を嶄伉に赫遺のソ`スをiんでみたお三をしようと房いました。
おさらい1 - GCとヒ`プ ヒ`プとは、プログラムが強恬嶄に駅勣に鬉犬謄瓮皀蠅圀しくなったときに聞うためのメモリ糟囃である。
プログラムが強議にメモリを鳩隠するとき、ヒ`プからメモリを俳り竃して、プログラムに局す。
赫遺とは仝ヒ`プ貧で聞われなくなった糟囃を盾慧し、プログラムがヒ`プを壅旋喘することができるようにする々プログラムのことである。
おさらい2 - もしGCがなかったら 赫遺がない桟廠でヒ`プが圀しくなった魁栽、苧幣議にヒ`プ護り輝て勣箔(掘恰.馨温鉛鉛看界())を佩い、ヒ`プが駅勣なくなった扮泣で苧幣議に盾慧(韓姻艶艶())する。
繁寂は寂離える伏き麗。韓姻艶艶()を梨れたり、韓姻艶艶()したヒ`プを壅業韓姻艶艶()したり、いろいろやらかす。
こういうバグは需つけるのがホントに寄筺
Dalvikの古勣 Dalvikとは、AndoroidのGC。
兆彭仝ガベ`ジコレクションのアルゴリズムとg廾々によれば、児云はマ`クΕ好ぉ`プなアルゴリズムでg廾されている???らしい。
(けれどコンパイルオプション肝及ではCopy GCも聞えるらしいです。)
さて、ソ`スをiむか???の念に念戻となる岑紛にXく乾れておきましょう。
念戻1 -マ`クΕ好ぉ`プ- 聞われなくなったヒ`プを盾慧するアルゴリズムの匯つ
ヒ`プ坪で聞われているオブジェクトを冥して咫をつけます。 ヒ`プ坪のオブジェクトの歌孚を桑にたどって、咫をつけていき ( マ`クフェ`ズ ) ??? 咫 咫 咫 咫
念戻1 -マ`クΕ好ぉ`プ- ヒ`プをサ`チして、聞われてないヒ`プを盾慧(スイ`プフェ`ズ)する。 ヒ`プを枠^からサ`チし、咫のついてないヒ`プを盾慧していきます。 ☆ サ`チの^殻で仝咫々はしますが、蹐里錣りやすさのため、仝咫々を火しています。 咫 咫 咫 咫 盾慧 盾慧 盾慧
念戻2 C ル`ト - 枠の仝マ`クフェ`ズ々で仝聞われているオブジェクトを桑にたどって々ときました。
たどるときの寄圷、枠^のオブジェクトを蒙に仝ル`ト々と冱います。箭えばJavaのオブジェクトの栽、參和楳のw侭がル`トになります。 gDvm
GCをしているのはどこ? 採を蘓擇没靴辰討い海Δ???。
書指はコンカレント赫遺を弖うわけだし。
grep -ri concurrent *
すると、參和のw侭をk需する。
vm/alloc/HeapSource.c:  dvmCollectGarbageInternal(false, GC_CONCURRENT);
GCをしているのはどこ? つけたw侭はstatic void *乙界禽温艶馨看稼意鞄姻艶温糸()というv方の嶄。
距べてみると、どうもこいつはスレッドで、ヒ`プの腎きが匯協のしきい、鯱損悗辰進韻剖くだ。
このv方は dvmCollectGarbageInternal() というv方を柵んでいる。兆念から冱ってもこいつが腎きメモリを指Г靴討い襪里世蹐Α
dvmCollectGarbageInternal うわ、Lい(丶)
及屈哈方はどうもこのv方を柵び竃した彜趨(尖喇)を局すものらしい。
尖喇の匯Eはvm/alloc/Heap.hのGcReasonで協xされている。 GC_CONCURRENT はそのうちの匯つ。
ソ`スを靖めてみると、 GC を柵び竃した尖喇によってI尖を笋┐討い襦書指は GC_CONCURRENT なケ`スにスポットを輝ててh苧します。
dvmCollectGarbageInternal GC_CONCURRENT な栽???
1.GC を佩うスレッドの枠業を貧げない
2.GC のI尖嶄に VM 坪の麿のスレッド ( ミュ`テ`タ ) が咾韻襪茲Δ砲垢I尖 (dvmResumeAllThreads(SUSPEND_FOR_GC);) がある。
-> 噸宥は GC を佩う栽、 VM 坪の麿のスレッドがメモリの彜Bを笋┐酉しくないので、 GC を佩うスレッド參翌の咾を峭めたいはず。
dvmCollectGarbageInternal けれど、 13 ペ`ジにいた 2 つのI尖によって麿のスレッドが咾韻襪茲Δ砲覆襪燭瓠⇒┳の VM のに仝I尖が耕まる々護栽がpる。
宥械の GC のイメ`ジ
コンカレントな GC のイメ`ジ 宥械I尖 宥械I尖 GC 宥械I尖 宥械I尖 宥械I尖
ここで融隼 ここで匯稀 dvmCollectGarbageInternal をxれて、 メモリ護り輝てのv方(dvmMalloc())をiんでみます。
いきなりマ`クΕ好ぉ`プな赫遺のI尖をiんでも仝んんっ殖殖拭垢箸いΩ个犬砲覆蠅泙后
まず、メモリ護り輝てをする縞に、どんなことをするのか赫遺議な篇泣からみてみましょう。
dvmMalloc()について 採らかのオブジェクトにメモリを護り輝てるHにはdvmMalloc()を柵んでメモリを_隠します。

More Related Content

糸温鉛厩庄一の赫遺をのぞいてみた