Movatterモバイル変換


[0]ホーム

URL:


Fumiyuki Yoshida, profile picture
Uploaded byFumiyuki Yoshida
9,492 views

dalvikのGCをのぞいてみた

dalvikでGCをしている箇所のソースを読んだので、そのまとめ。

Embed presentation

Downloaded 118 times
dalvik の GC をのぞいてみた @akachochin
自己紹介 名前:@akachochin
某メーカーでMFPやプリンタにnetbsdなOSを組み込んで、飲み代稼いでいるひと。
どうにかこうにか、コーディング含めた開発業務にありつけています。
趣味は名前のとおり、赤提灯めぐり。
場末の呑み屋、さいこー。
今回GCを選んだわけ 懇親会でうっかり「じゃあ、喋ってみようかな」と口走ったから(笑)
ネタ探しでWeb Pageみてたら「2.3からコンカレントGCをサポート」と書いてあった。
もともとOS屋でメモリ管理まわりは興味があった。
こうしたわけで、コンカレントGCを中心にGCのソースを読んでみたお話をしようと思いました。
おさらい1 - GCとヒープ ヒープとは、プログラムが動作中に必要に応じてメモリが欲しくなったときに使うためのメモリ領域である。
プログラムが動的にメモリを確保するとき、ヒープからメモリを切り出して、プログラムに渡す。
GCとは「ヒープ上で使われなくなった領域を解放し、プログラムがヒープを再利用することができるようにする」プログラムのことである。
おさらい2 - もしGCがなかったら GCがない環境でヒープが欲しくなった場合、明示的にヒープ割り当て要求(Ex.malloc())を行い、ヒープが必要なくなった時点で明示的に解放(free())する。
人間は間違える生き物。free()を忘れたり、free()したヒープを再度free()したり、いろいろやらかす。
こういうバグは見つけるのがホントに大変。
Dalvikの概要 Dalvikとは、AndoroidのGC。
名著「ガベージコレクションのアルゴリズムと実装」によれば、基本はマーク&スイープなアルゴリズムで実装されている・・・らしい。
(けれどコンパイルオプション次第ではCopy GCも使えるらしいです。)
さて、ソースを読むか・・・の前に前提となる知識に軽く触れておきましょう。
前提1 -マーク&スイープ- 使われなくなったヒープを解放するアルゴリズムの一つ
ヒープ内で使われているオブジェクトを探して印をつけます。 ヒープ内のオブジェクトの参照を順番にたどって、印をつけていき ( マークフェーズ ) ・・・ 印 印 印 印
前提1 -マーク&スイープ- ヒープをサーチして、使われてないヒープを解放(スイープフェーズ)する。 ヒープを先頭からサーチし、印のついてないヒープを解放していきます。 ※ サーチの過程で「印」は消しますが、図のわかりやすさのため、「印」を残しています。 印 印 印 印 解放 解放 解放
前提2 – ルート - 先の「マークフェーズ」で「使われているオブジェクトを順番にたどって」と書きました。
たどるときの大元、先頭のオブジェクトを特に「ルート」と言います。例えばJavaのオブジェクトの場合、以下青の箇所がルートになります。 gDvm
GCをしているのはどこ? 何を糸口に追っていこうか・・・。
今回はコンカレントGCを追うわけだし。
grep -ri concurrent *
すると、以下の箇所を発見する。
vm/alloc/HeapSource.c:  dvmCollectGarbageInternal(false, GC_CONCURRENT);
GCをしているのはどこ? 見つけた箇所はstatic void *gcDaemonThread()という関数の中。
調べてみると、どうもこいつはスレッドで、ヒープの空きが一定のしきい値を下回った時に動く様だ。
この関数は dvmCollectGarbageInternal() という関数を呼んでいる。名前から言ってもこいつが空きメモリを回収しているのだろう。
dvmCollectGarbageInternal うわ、長い(笑)
第二引数はどうもこの関数を呼び出した状況(理由)を渡すものらしい。
理由の一覧はvm/alloc/Heap.hのGcReasonで定義されている。 GC_CONCURRENT はそのうちの一つ。
ソースを眺めてみると、 GC を呼び出した理由によって処理を変えている。今回は GC_CONCURRENT なケースにスポットを当てて説明します。
dvmCollectGarbageInternal GC_CONCURRENT な場合・・・
1.GC を行うスレッドの優先度を上げない
2.GC の処理中に VM 内の他のスレッド ( ミューテータ ) が動けるようにする処理 (dvmResumeAllThreads(SUSPEND_FOR_GC);) がある。
-> 普通は GC を行う場合、 VM 内の他のスレッドがメモリの状態を変えて欲しくないので、 GC を行うスレッド以外の動きを止めたいはず。
dvmCollectGarbageInternal けれど、 13 ページに書いた 2 つの処理によって他のスレッドが動けるようになるため、通常の VM の様に「処理が固まる」割合が減る。
通常の GC のイメージ
コンカレントな GC のイメージ 通常処理 通常処理 GC 通常処理 通常処理 通常処理
ここで突然 ここで一旦 dvmCollectGarbageInternal を離れて、 メモリ割り当ての関数(dvmMalloc())を読んでみます。
いきなりマーク&スイープなGCの処理を読んでも「んんっ???」という感じになります。
まず、メモリ割り当てをする際に、どんなことをするのかGC的な視点からみてみましょう。
dvmMalloc()について 何らかのオブジェクトにメモリを割り当てる際にはdvmMalloc()を呼んでメモリを確保します。

Recommended

ODP
コンカレントGc
ODP
Dtrace in netbsd
PPTX
初心者のためのACPI
ODP
NetBSD BOFで話したDTraceの話
PDF
ちょっとOverlayfsの実装、読んでみました(A brief report of overlayfs source code reading)
PDF
GCをみればRTSが見えてくる、かも。。。
 
PDF
マーク&スイープ勉強会
 
PDF
プログラムを高速化する話
PDF
みんな大好きJava gc入門 【前編】
PPT
2012年javaメモリリーク
 
PDF
Scalaで実装するGC
PPTX
C#/.NETがやっていること 第二版
PDF
ガベージコレクション(GC)10分ハック
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
Magic Ring Buffer
PPTX
GCについて
PDF
これからのコンピューティングとJava(Hacker Tackle)
PDF
JVMのGCアルゴリズムとチューニング
PDF
JVM-Reading-ConcurrentMarkSweep
PDF
小二病でもGCやりたい
 
PDF
コンピューティングとJava~なにわTECH道
PPTX
第六回渋谷Java Java8のJVM監視を考える
PDF
GC黄金時代
PPT
JVM-Reading-ParalleGC
PPT
Jvm reading-parallel gc
PDF
Drawing Dataflow On Dalvik Bytecodes
PDF
ハードウェア脳とソフトウェア脳

More Related Content

ODP
コンカレントGc
ODP
Dtrace in netbsd
PPTX
初心者のためのACPI
ODP
NetBSD BOFで話したDTraceの話
PDF
ちょっとOverlayfsの実装、読んでみました(A brief report of overlayfs source code reading)
PDF
GCをみればRTSが見えてくる、かも。。。
 
PDF
マーク&スイープ勉強会
 
PDF
プログラムを高速化する話
コンカレントGc
Dtrace in netbsd
初心者のためのACPI
NetBSD BOFで話したDTraceの話
ちょっとOverlayfsの実装、読んでみました(A brief report of overlayfs source code reading)
GCをみればRTSが見えてくる、かも。。。
 
マーク&スイープ勉強会
 
プログラムを高速化する話

Similar to dalvikのGCをのぞいてみた

PDF
みんな大好きJava gc入門 【前編】
PPT
2012年javaメモリリーク
 
PDF
Scalaで実装するGC
PPTX
C#/.NETがやっていること 第二版
PDF
ガベージコレクション(GC)10分ハック
PDF
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
PDF
Javaはどのように動くのか~スライドでわかるJVMの仕組み
PDF
Magic Ring Buffer
PPTX
GCについて
PDF
これからのコンピューティングとJava(Hacker Tackle)
PDF
JVMのGCアルゴリズムとチューニング
PDF
JVM-Reading-ConcurrentMarkSweep
PDF
小二病でもGCやりたい
 
PDF
コンピューティングとJava~なにわTECH道
PPTX
第六回渋谷Java Java8のJVM監視を考える
PDF
GC黄金時代
PPT
JVM-Reading-ParalleGC
PPT
Jvm reading-parallel gc
PDF
Drawing Dataflow On Dalvik Bytecodes
PDF
ハードウェア脳とソフトウェア脳
みんな大好きJava gc入門 【前編】
2012年javaメモリリーク
 
Scalaで実装するGC
C#/.NETがやっていること 第二版
ガベージコレクション(GC)10分ハック
これからのコンピューティングの変化とJava-JJUG CCC 2015 Fall
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Magic Ring Buffer
GCについて
これからのコンピューティングとJava(Hacker Tackle)
JVMのGCアルゴリズムとチューニング
JVM-Reading-ConcurrentMarkSweep
小二病でもGCやりたい
 
コンピューティングとJava~なにわTECH道
第六回渋谷Java Java8のJVM監視を考える
GC黄金時代
JVM-Reading-ParalleGC
Jvm reading-parallel gc
Drawing Dataflow On Dalvik Bytecodes
ハードウェア脳とソフトウェア脳

dalvikのGCをのぞいてみた


[8]ページ先頭

©2009-2025 Movatter.jp