JavaプログラマのためのAndroidシステム開発の注意点

 ソフトウエアは実行されるとその内部でオブジェクトを作っては破棄するということを大量に行います。

 これは処理系に依らずそうですが、Javaや.Netではガベジコレクション(以降、GC)の仕組みがあり、その情報が広く知られています。

 一般的にはまず以下を守れば良いとされます。

  1. システムリソースを使用したら必ずそれを解放してから関連するオブジェクトを破棄すること。
  2. 破棄できないオブジェクトが増え続けないこと。一定のサイズに収まるか予測ができること。

 次に、大量のリクエストを処理するサーバーなどでは、処理速度をあげるとともに、GCに係る時間を極力少なくする必要があります。GCは破棄されたオブジェクトの使用するメモリ領域を実際に破棄する処理なので、単純に考えるとオブジェクト数を減らせば良い、となります。一般的には複雑なオブジェクト(内部に多くのオブジェクトを持つ)や重いオブジェクト(メモリ領域を大量に消費)はプールして使いまわします。設計者はシステム開発全体を見て、それらを実施するかどうかを決めます。

 

 Androidではサーバサイドとは真逆の、リクエストが一つしかない世界ですが、さらにCPU、消費電力を考慮してオブジェクトの管理をしっかり意識する必要があります。

考え方は組み込み系の範疇に入ります。

 さて、Andoroidマシンの仮想マシンはDalvikというものです。これはPCやサーバ向けの仮想マシンとは全く違う、使用できるリソースの少ないモバイルマシン向けに作られており、Java互換性テストも通っていません。

 通常の仮想マシンは「世代別GC」という方式で動いていますが、それは「大多数のオブジェクトは短命」という仮説に基づいています。アプリケーション開発側はオブジェクトは作っては破棄するものという前提で設計します。また、快適にJavaアプリを稼働させるようGCの設定をすると結構なメモリを使用します。

 それに対してDalvik仮想マシンは「マークアンドスイープ」を採用しています 。これは、まず砿実に必要なオブジェクトにから参照をたどり、使っているオブジェクトにマークを付けます。そのあと、印の付いていないオブジェクトを解放します。GCの時以外は何もしないので比較的高速にどうさしますが、GCの間全てのスレッドが停止するので、オブジェクトをなるべく作らない事が勧められます。

 AndroidSDKのDDMS(DalvikDebug MonitorService)というデバッグツールの、Allocation Trackerでメモリー状況を見て試験してみると良いでしょう。

 

 

 

 

 

 

 

 

 

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>