デフォルトで確保される領域については以下の通りです。呼ばれている)で管理されています。チャンク(リストのノード)のサイズは、フリーチャンクの最後の4バイトにも記録されています。これを活用して隣接するフリーチャンクを結合してメモリの断片化を避けています。各binはサイズ別にチャンクを管理しており、求めるサイズのチャンクをすばやく探せるようになっています。チャンクを解放するとき、可能であれば隣り合うフリーチャンクと結合させます(断片化防止)。解放するチャンクの直前または直後に位置するチャンクがフリーであれば、そのフリーチャンクはbinから外され、解放しようとしているチャンクと結合して適切なbinに配置されます。チャンクの構造は以下のようになっています。派生したもの、歴史はとても古いのです。シンプルな仕組みなのに効率が良く、現在でも広く利用されています。詳細は本家サイトにて、図付きでわかりやすいです。VMのインスタンスをホストしています。Dalvikは、デバイスが複数の仮想マシンを同時に効率よく実行できるように設計されています。Executable)ベースのファイルを実行するからです。DEXはメモリの占有を最小限に抑えるよう最適化されたフォーマットです。Formatデータ型DEXファイルフォーマットで扱えるデータ型は以下の11種類です。バイトオーダーはリトルエンディアンとなっています。128)では可変長整数を扱います。フォーマットを参考にしたもので以下のような構造(2バイトの場合)になっています。|各バイトの7ビットがデータで最上位ビットを使ってデータの終端を示しています。上の例だと2バイト目の最上位ビットが落ちているため、ここでこのデータは終了ということになります。値の大きさによってデータ長も変化するので、小さな整数値だとデータ長も短くなります。LEB128のような可変長整数の扱い方は特に珍しくはなく、バイナリネットワークプロトコルだとよく見かけます(thriftとか)。ファイルレイアウト内部のセクションは以下のようになっています。型のシグネチャはJNIを利用するときにもよく目にします。以下にシグネチャと型の対応を載せます。double型配列を表します。VMはJavaバイトコードを実行しません。コンパイルされたJavaのクラスファイル(.class)をDEXファイル(.dex)に変換して生成されたバイトコードが実行されます。dxclassファイルをdexファイルに変換できるコマンド。SDKに入っています。message.実際にAndroidプロジェクトディレクトリで以下のようにコマンドを実行してみます。オプションで出力ファイル名を指定し、その後に変換対象のclassファイルを含んだディレクトリを指定します。ファイルが生成されていたら成功です。コマンドで中身を覗くことができます。VMはレジスタマシンとして実装されています(JVMはスタックマシン)。VMバイトコードの特徴を整理します。コマンドを使って整理していきます。SDKに入っています。コマンドでdexファイルに変換。コマンドを使ってその中身を覗いてみます。オプションを付けて実行します。(HelloWorld.java)Helloworldクラスでは単純な演算命令しか使っていないのでバイトコードを読むのも楽だと思います。以下にアーキテクチャ毎のバイトコードインタプリタのコードが入っています。Sweep(ビットマップマーキング)アルゴリズムを採用しています。Write(データの書き換えが発生した時にコピーを行う)と相性が悪いです。Sweepは生きているオブジェクトのヘッダにマークビットを立てますが、これを行うと本来は必要のないコピーが行われてしまうからです。VMではビットマップマーキングという手法を併用してこの問題に対処しています。この手法は各オブジェクトのマークビットだけを集めたテーブル(ビットマップテーブル)を用意し、オブジェクトとは別の場所で管理する手法です。VMのオブジェクトは専用のヒープに保持されます。用のヒープ、もう1つはAndroidアプリケーションで使用するヒープです。ヒープの中身は以下のようになっています。メンバとして持っています。オブジェクトはこの中にアロケーションされます。dalvik/vm/alloc/HeapBitmap.hマーキングで用いるビットマップは以下のように定義されています。};処理の詳細については調べながら追記していきます。