Androidアプリの内部動作に関する情報(2)
皆さまに質問:iPhoneOS4.0のマルチタスク化で、改めて #Android の動作モデルに興味が湧きました。Dalvik VMの各インスタンスがそれぞれLinuxプロセスとして動きずっとメモリ常駐、との理解で合ってますか? また良い資料があれば教えてくださいませんか?
2010-04-09 18:46:50@AkioHoshi Google I/O 2008での Anatomy&Physiology of an Android http://bit.ly/6dDKXL と Dalvik VM Internals http://bit.ly/bPqWN が未だに一番詳しいです。
2010-04-09 19:12:10Androidの動作モデルに関するGoogle I/Oの発表資料を見てます。今更ながら改めて見直すと、JavaでもLinuxでもない。独自OSぐらいに思った方がいいですね。現実的でモダンで独創的。しかもオープンソース。
2010-04-09 22:47:41Androidの動作モデルの件、Dan Bornsteinの "Dalvik VM Internals" http://bit.ly/bPqWN にいは "OS without swap space" との問題意識とメモリ効率についての議論があり、興味深く見ました。
2010-04-09 23:03:56亀レスですがhttp://bit.ly/9vW7Cf の 「androidの画面描画機構をチューニングする!」の資料が一部役に立つかも QT @AkioHoshi: 皆さまに質問:… Dalvik VMの各インスタンスがそれぞれLinuxプロセスとして動きずっとメモリ常駐、との…
2010-04-10 04:24:40@mryo0826 情報ありがとうございます。見てみます。なお、今まで頂いた情報を http://bit.ly/aK7kng にまとめています。
2010-04-10 07:06:04.@AkioHoshi DalvikVMについて。ZygoteのプロセスはDalvikVMそのもののインスタンス。Javaのプログラムを実行するプロセスはZygoteからforkされる。
2010-04-10 10:23:19@tetsu_koba ありがとうございます。Anatomy&Physiology of an Android http://bit.ly/6dDKXL のスライドpp.82-94 あたりが関係ありそうですね。
2010-04-10 10:35:10このときLinuxのシステムコールのforkが使用されるが、exec系は使われない。なので、プロセスの中のメモリの初期状態はZygoteと同じ。書き込みがあったところだけCopyOnWriteのしくみが働く。
2010-04-10 10:26:35Zygoteは通常必要になる全てのダイナミックリンクライブラリがあらかじめロードされている。だから新しいJavaのプロセスは最初から必要なダイナミックリンクライブラリがすでにメモリ上にある状態から開始される。
2010-04-10 10:28:59Zygotoは時々明示的にガベージコレクションを行っている。これも新しいJavaプロセスのJavaのヒープメモリが「綺麗な」状態から始まるようにするための工夫だと思われる。
2010-04-10 10:30:28どんどん呟いてー QT @tetsu_koba: .@AkioHoshi DalvikVMについて。ZygoteのプロセスはDalvikVMそのもののインスタンス。Javaのプログラムを実行するプロセスはZygoteからforkされる。
2010-04-10 10:30:30Javaのプログラムを動かすためにはDalvikVMをはじめとしてたくさんのダイナミックリンクライブラリを必要とするのでメモリの使用量は普通のネイティブのプログラムよりも大きくなる。
2010-04-10 10:33:24しかし、たくさんのJavaプログラムが動作している状況では全てのリードオンリーのコードとデータはJavaプロセスの間で共有されるのでトータルのメモリ使用量は節約できる。
2010-04-10 10:34:06imodeなどのJavaVMは搭載するOS間の互換性を重視するために、このような仮想メモリを活用する実装はできなかったと思われる。最初に携帯にJavaが載った頃のOSには仮想メモリの仕組みはなかった。
2010-04-10 10:40:46最初からシステムに存在するダイナミックリンクライブラリはあらかじめ重ならないようにロードアドレスが決められている。つまりprelinkされている。
2010-04-10 10:43:33普通のPCのLinuxでは世の中の全てのダイナミックリンクライブラリを重ならないようにアドレスを決めようするとユーザーメモリのアドレス空間に入りきれなくなる。
2010-04-10 10:51:02Androidの場合は同時に使う可能性のあるダイナミックリンクライブラリを全て並べてもユーザーメモリ空間からはみ出ることはないことを前提にしてよい。なのではるかに簡単な仕組みになっている。
2010-04-10 10:55:03これもそれ以前の携帯とは設計思想が大きくことなるところ。JavaVMは後から追加されたものなので、JavaVMのほうが既存のしくみにあわせるしかなかった。
2010-04-10 10:58:39