Androidのメモリ関連について検証してみた

Androidのメモリに関した話は様々な憶測が飛びかっていたので、実際にどのように動作しているのかを実機を用いて検証してみました。

アプリが起動しているかどうかの確認はAdvaned Task Killerで、メモリの使用量についてはadb shellからfreeコマンドで確認しました。

今回の検証内容です。

1. アプリはいつ終了されるのか?

基本的にアプリを実行してからホーム画面に戻ったとしても、アプリは終了されません。
しかしメモリには限界があるので、メモリ以上のアプリは起動することはできません。
ではいつアプリは終了されるのでしょうか?

2. アプリが終了しているときとバックグラウンドにいるときでは、アプリを呼び出す時間に差はあるのか?

Androidが基本的にアプリを終了しないのには理由があるはずです。
その理由を解明したいと思います。

3. swapを設定すると、メモリが限界になったときアプリを終了せずにちゃんとswapされるのか? (rootを取っていない方は読み飛ばしてください)

Android OSのrootを取得しているとSDカードにswap領域を用意することができます。
しかしこのswap領域を用意して使うことのメリットはあるのでしょうか?
通常のRAMと比較して動作に違いはあるのでしょうか?
swapの作成方法はこちら

SDにスワップパーティションを作成する方法 - GeekなNooblog
http://d.hatena.ne.jp/sona-zip/20101226/p1

4. アプリがバックグラウンドのタスクとして残っているときとそうでないときの電池使用量に違いはあるのか?

この項目はswapをどれくらい確保すればいいかを考えるために行います。
もし検証2でアプリを終了しない方がアプリの起動が早いという結果が出て、かつ検証3でswapを確保することにメリットがあり、かつ電池使用量に差がない場合は、swapを限界まで確保した方が良いということになります。


まずは検証1について確認していきましょう。

1. アプリはいつ終了されるのか?

環境はHT-03A pubrom1.0 (Android 2.2 Froyo) swap off状態です。
最初にアプリをこのような状態にしてメモリの利用状況を確認してみます。

total used free
Mem: 97708 91432 6276

アプリがほとんど起動していない状況でもメモリに空きは6MBしかないことが確認できます。



その後しばらく放置しておくとこれらのアプリが起動していました。
ジョルテやK-9 Mailは定期的にデータを更新するため自動的に起動されるようです。

total used free
Mem: 97708 95140 2568

更にアプリが起動されたためメモリ使用量が増えていることが確認できます。




ではここでBrowserを起動してみましょう。

total used free
Mem: 97708 94608 3100

なんとメモリの空きが2568KByteから3100KByteに増えています。
よくよくアプリの一覧を見てみると、ジョルテが終了されていることがわかります。



検証1わかったこと その1
Androidでは新たにアプリを起動して、メモリが不足すると自動的に利用していないと判断されるアプリを終了する。




またしばらく放置していると以下のようになりました。

total used free
Mem: 97708 94356 3352

Browserが自動的に終了され、メモリの空き容量がまた増えています。



検証1でわかったこと その2
Androidではしばらく使ってないアプリを自動的に終了し、メモリの空き容量を増やす。




続いて検証2について確認していきましょう。

2. アプリが終了しているときとバックグラウンドにいるときでは、アプリを呼び出す時間に差はあるのか?

まずメモリにない状態でアプリを初回起動してみます。
すると↓のような画面が長らく続きます。




6秒経過しやっと↓のようなマップが表示されました。




ここでホーム画面に戻り再度起動してみます。
今回は一瞬で↓のようにGoogle Mapが表示されました。


以下の動画は上記の一連の流れを動画に撮ったものです。




またtwiccaでは4秒が一瞬に、つぼろいどんでは2秒が一瞬で表示されるようにという結果になりました。


検証2でわかったこと
アプリがメモリ上にないときは起動に時間がかかるが、メモリ上にあるときは一瞬で表示される。



次は検証3です。

3. swapを設定すると、メモリが限界になったときアプリを終了せずにちゃんとswapされるのか? (rootを取っていない方は読み飛ばしてください)

検証1と同じアプリを起動してみました。

total used free
Mem: 97708 94784 2924
Swap: 0 0 0


続いてswaponにしますと、こんな感じになります。今回はスワップパーティションを64MB確保しています。

total used free
Mem: 97708 94924 2784
Swap: 64256 0 64256


ここでBrowserを起動します。

先ほどはここでジョルテが終了してしまいましたが今回は事前に起動していたアプリが終了していないことが確認できます。

またちゃんとSwapが利用されていることも確認できました。

total used free
Mem: 97708 96248 1460
Swap: 64256 1816 62440


更にGoogle Mapも起動してみます。

total used free
Mem: 97708 96116 1592
Swap: 64256 19848 44408

以上のようにSwapが利用されていることが確認できました。
ではSwapされたアプリは検証2のときと同様にアプリの起動は早いのでしょうか?
結論だけいってしまうとこのとき起動しているアプリをすべて試してみましたが、Swapと物理メモリの違いはわかりませんでした。




検証3でわかったこと その1
Swap領域を確保するときちんとswapされる

検証3でわかったこと その2
Swap領域と物理メモリでは特に動作の違いを感じることはない。



4. アプリがバックグラウンドのタスクとして残っているときとそうでないときの電池使用量に違いはあるのか?

最後に検証4です。

ここまでの検証でSwap領域は取れるだけとったほうがアプリの復帰が早いので良いということがわかりました。
しかしそれによって電池の消費量が増大してしまっては意味がありません。

そこで今回は電池切れから充電していき、電池残量を2%になった瞬態から電源が切れるまでの時間を、アプリが3個起動している状態とアプリが15個起動している状態で比較をしてみました。

環境

クロックは528MHz固定
swap 64MB
Sleep状態です。

結果

アプリ3個 2時間11分8秒 
アプリ15個 43:30




検証4でわかったこと
アプリが起動しているとその分だけ電池の消費量は増える。


検証まとめ

検証1でわかったこと

  1. Androidでは新たにアプリを起動して、メモリが不足すると自動的に利用していないと判断されるアプリを終了する。
  2. Androidではしばらく使ってないアプリを自動的に終了し、メモリの空き容量を増やす。

検証2でわかったこと

  1. アプリがメモリ上にないときは起動に時間がかかるが、メモリ上にあるときは一瞬で表示される。

検証3でわかったこと

  1. Swap領域を確保するときちんとswapされる
  2. Swap領域と物理メモリでは特に動作の違いを感じることはない。

検証4わかったこと

  1. アプリが起動しているとその分だけ電池の消費量は増える。

総括

結論としては、自分が利用する時間と相談しながら、できる限りswapを確保することが理想です。
運用方法としては、自分がAndroid端末を操作しているときはSetCPUでクロックを最大に設定する。そしてSwapもめいいっぱい使い、できる限りアプリを常駐させて、アプリの切り替え動作をスムーズにする。
スクリーンをOFFにしているときは、SetCPUでクロックを最低まで下げて、Advanced Task Killerで起動しているアプリをすべて終了させる。とすると、快適でかつ電池容量の節約になり良いのではないのでしょうか。