AX
【iPhone】わけがわからないよ。どうして空きメモリにそんなにこだわるんだい?
iPhoneのアプリでちょくちょくランキング上位に現れるステータスモニタ関連のアプリ。
CPUの使用状況を確認できるものだったり、メモリの使用状況を確認できるものだったり。

それらのアプリの中でメモリを解放してくれる機能も搭載している
アプリとかもあるのだが、少し疑問に思うことがある。

「メモリって自分で解放する必要あるの?」

iPhoneが不安定だったらメモリを解放するといいよ。
iPhoneの空きメモリが少なくなったらメモリを解放するといいよ。
iPhoneはメモリを使ってるとバッテリ消費が速くなるからメモリは解放するといいよ。

なんてことを言う人がいる。果たしてそれは本当なのか?
私はよほど変な使い方をしていない限り、メモリは意図的に解放しなくてよいと思っている。

そんなわけで(どんなわけで?)メモリの話をしましょう。
メモリとは。
今回の話は物理メモリの話です。RAM(RandomAccessMemory)とも呼ばれますね。
私の使っている iPhone 4S の場合は 512MB の物理メモリを搭載しています。
16GBあるドライブのメモリとはまた別です。こちらはフラッシュドライブと呼ばれているそうです。
ちなみにパソコンだとこの他に仮想メモリというものもありますが、
iPhoneは仮想メモリを扱わないので省略します。

iPhoneは(正確に言うとiOSは)物理メモリ(以下メモリ)を4つの種類に分けて管理をしています。
ステータスモニタのアプリを使ったことがある人なら見たことがある言葉だと思いますが、
以下の通りになってます。
  1. Wired(固定中)
  2. Active(現在使用中)
  3. Inactive(現在非使用中)
  4. Free(空き)

一体全体どんなメモリなのかよくわかりませんね。非使用中においては日本語が正しいのかすら怪しい。未使用なのか不使用なのか非使用なのか(^^;

調べてみるとこういうことらしい。
http://support.apple.com/kb/HT1342

Wired : 解放されることがほとんどない、もしくは解放できないメモリ。
Active : 現在起動中のアプリが使用しているメモリ。
Inactive : 終了しているアプリが起動中に使っていたメモリ。使われてはいないので事実上空きメモリ。
Free : 空きメモリ。使用可能なメモリ。

自分なりの解釈を入れて、つまりはどういうメモリを噛み砕いてみると、

Wiredは OS などが使うメモリでiPhoneや起動中のアプリそのものを動かすのに必要なメモリ。
Activeは 文字通り起動中のアプリが使っているメモリ。このメモリは起動中のアプリの
使用状況によって増えたり減ったりするはず。ゲームなんかはたくさんの画像、音楽を
使うことが多いのでメモリを多く必要とすると思います。
Inactiveは 現在使っていないけど、また使うかもしれない。でも使ってもいいメモリ。
非使用中という日本語も「あーなるほど」って感じです。
まだ少し分かりにくいので例をあげると、

空きメモリを200MBとする。
100MBのメモリを使用するゲームAのアプリを起動。
Free:100MB
Wired:今回は無視。実際は起動アプリによる。アプリのサイズ以上は取られることはないかと思う。
Active:100MB
Inactive:0MB

さらに80MBのメモリを使用するゲームBのアプリを起動。
Free:20MB
Wired:同じく無視。
Active:180MB
Inactive:0MB

続いてゲームAを終了する。
Free:20MB
Wired:同じく無視。
Active:80MB
Inactive:100MB(ゲームAが使っていたメモリ)

再びゲームAを起動する。
Free:20MB
Wired:同じく無視。
Active:180MB
Inactive:0MB(保存されていた非使用中のメモリが使用中になる)

実際は少し違うものだと思うが大体こんな感じになるかと思う。

で、最後に、

Free:説明するまでもなく空きメモリ。
ちなみに iPhone 4S には512MBのメモリを搭載していますが、
メモリの一部はGPU用のメモリとして確保される(8MB固定?)らしく、
ステータスモニタアプリでメモリのサイズを調べても512MBより小さく表示されます(504MB)。


ということで、メモリがどういうものか少しわかったところで、
今度はメモリ解放アプリがどのメモリを解放しているか考えてみる。

まず、Wired。OSが使用する分のメモリは解放することはできない。逆にそれ以外の
Wiredのメモリは解放できるはず。常駐アプリが使用しているメモリとか、たぶんそういうの。
続いてActive。基本解放できないはず。何故なら現在使用中だからである。
使用中のメモリを解放すると起動中のアプリが異常を起こし、終了してしまうだろう。
ただし、iOSには起動中のアプリにメモリを解放するように要求する仕組みがある。
その仕組みによってバックグラウンドで起動しているアプリなどを終了させて
空きメモリを作ることもできる。
で、最後にInactive。こちらは使っていないメモリなので解放できる。

ということで、メモリ解放アプリはWired, Active, Inactive全てのメモリを少しづつ
解放しているものと考えられる。

で、結局のところ メモリ解放は意味があるのか?

色々調べてみましたが、どうもメモリ解放アプリは
iPhoneを再起動するよりメモリが解放できるらしい。
つまり、メモリ解放アプリでメモリを解放する意味はあると言って良いと思う。
ただし、それはiPhoneを再起動してもメモリが足りないアプリを起動したい場合に限る。
その他の場合は、iOSが自動でメモリを解放・確保してくれるから敢えて手動で行う必要はない。
強いて言うなら、iOSが(手動でもそうだが)メモリを解放するのに処理が必要だから
リアルタイムな処理を要求するゲームなどの場合、メモリ解放時に処理落ちの様な現象が起こるのを抑制するために。またはアプリ実装者の怠慢やアプリ自体の不具合でメモリを正常に確保できない場合に。そういったところでは、メモリ解放を手動で行うのも良いと思う。
ただ、メモリ解放アプリを使うと再起動よりメモリが空くらしいので普通に考えて少し怖い。
何か解放しちゃ行けないメモリまで解放してしまっているのではないか?と。不安になる。
逆に不安定にならないか、と。

大したことではないが、一応メモリ解放によるデメリットを書いておく。
先に書いたが、解放されてしまうメモリには非使用中のメモリがある。
Inactiveのメモリがそうだが、Wiredで解放されるものも非使用状態と同じだと思う。
つまり次に使われるために待機しているメモリということです。
それらのメモリを解放することで アプリの起動が遅くなったり、アプリの処理が遅くなったりすることがある。
昔のOSとは違い、メモリはあれば使っている方が良いんです。なるべく100%に近い状態で
動かした方が効率良く動くようになっているのです。

ところで、メモリ解放アプリを使ってもマルチタスクバー
(ホームボタンを2回クリックすることで表示されるアレ)のアプリの一覧は消えません。
何故なら、マルチタスクバーに表示されているアプリの一覧はバックグラウンドで実行されているアプリではないからです。
よく勘違いしている人を見かけるが、あれは実行アプリの履歴みたいなもので、
実際にアプリが動いているかどうかは関係ない。
なので一生懸命全部消す必要などないのだ。
ただ、アプリの中にはバックグラウンドで実行されるアプリもあるので、
それらのアプリを終了したい場合は手動で消すと良いだろう。例えばSkypeとかがそう。

んで、マルチタスクバーのアプリを消す意味がないかというと、
あのアプリの一覧を作成するのにもやはりメモリは必要なので消せばほんのわずかだが
メモリは解放されると思う。ゆえに意味はある。
気になる人は消せば良いと思う。

最後に。
メモリやバッテリー、その他色々。快適に使いたいなら優良なアプリを探すことが一番です。
変なアプリを使うとろくなことがないです。

やたらメモリを使用するアプリ。
最悪の場合はメモリリークするアプリだったりするかも。

バッテリーをよく使うアプリ。
アプリの実装の仕方でバッテリーの消費が大きく変わります。

不良とまではいいませんが、広告付きのアプリには注意。
広告を表示するのにメモリを使いますし、バッテリーも使います。
メモリは気にするほどのものではないですが、バッテリーは結構影響すると思います。
理由を簡単に説明すると広告はネットワーク接続を必要としているからです。
アップル提供の開発ガイドにも明記されていますが、ネットワーク接続はバッテリを消費します。
広告の表示は定期的に更新を行うからなおさらバッテリーを使います。

有料アプリが優良アプリとは言いませんし、無料アプリが不良アプリとは言いませんが、
iPhoneで発生する問題を解決する一番簡単な方法は100円玉を使うことかもしれません。


[PR]
by manodeldio | 2012-05-28 23:30 | 携帯電話


<< 今年もやる気のないサイトは相変... 【iPhone】iPhoneは... >>