スマートフォンやPCを使っていて、少しだけガジェットに詳しい人は、メモリ使用量などをモニターするアプリなどを使ってメモリの消費量を調べたことがあるだろう。
中途半端にガジェットに詳しい人だとメモリの使用量が多い場合に「メモリクリーナー」「メモリ最適化」「メモリ掃除」などと称したメモリを解放したりするアプリを使って、メモリの空き容量を増やしたりすることもあるかもしれない。
この類のアプリは全く無意味であって、何のメリットも及ぼさない。以下になぜかをまとめた。
メモリ解放アプリは無駄なメモリ確保をして他のアプリの邪魔をする
メモリ解放と称したアプリは、メモリを過大に確保することにより、他のアプリのキャッシュやファイルキャッシュをOSに消させて、自分の分のメモリとする。
Androidのメモリ管理についてのドキュメントにはこういう記載がある。
メモリなどのリソースが少なくなると、システムはキャッシュ内のプロセスを強制終了します。また、システムは、ほとんどのメモリを保持しているプロセスも考慮し、それらを終了して RAM を解放する可能性もあります。
つまり、簡単に言えばメモリ解放アプリは自らが必要な分のメモリを過大申告し、他のプロセスのために確保されているアプリの分のメモリを横取りしているというわけだ。その後、自らの確保した分の領域を捨てることで、空いたメモリが増えたように見せる。
こうして増えた「空き」メモリには何もメリットがない。
「メモリ解放」はOSがやること
メモリ解放アプリが空けたメモリ領域は、確かに新規で起動するアプリのために利用される。しかしながら、メモリ解放アプリでわざわざ解放せずとも、Androidのドキュメントにあるように、OSはメモリの不足を検知すると、その他のアプリを終了したり、キャッシュをクリアを行うことで不足分を確保する。メモリ解放アプリがわざわざやることではないのだ。
「メモリ解放」のデメリット
メモリ解放は他のプロセスを終了したり、キャッシュを削除したりすることに他ならないため、そのデメリットとしては、アプリを起動する時間やCPUの消費が余計にかかってしまう。またファイルキャッシュを削除することで、ストレージのアクセスが増え、これもまた時間と消費電力の増大につながる。
PCのメモリ管理
PCでも同じだ。基本的にプロセスが起動して大きなメモリ領域が必要になると、OSにメモリの確保を要求する。OSは空いているメモリからメモリのアドレスを返して、それをプロセスが使えるようにする。空いていなければ、ファイルキャッシュなどで使われている部分などから回収し、プロセスに割り当てていく。足りない場合はスワップに書き出されることもある。
空きが多いのは「いいこと」ではない
スマホやPCは、ストレージなどから読み出されたファイル(写真やアプリなど)をメモリに持っておく(キャッシュ)機能がある。一度読み込んだものをメモリに保持することで、遅いストレージから読み込まないようにするためだ。
コンピュータの記憶装置の構造
基本的に、コンピュータは以下のような記憶装置の階層構造がある。
記憶装置とはメモリも含むし、SDカードやスマホのストレージも含む。
情報工学ではまず初めに教わることではあるが、CPUの内部にあるようなレジスタやキャッシュといった超高速な記憶装置は容量が極めて小さい。なので、下層にある容量の大きい記憶装置に今すぐには処理しないデータや重要度の低いデータを置いておくといったことをする。
下から見ていこう。あなたは撮った動画を見たい。スマホのストレージ(ROMなどという人もいるが、正しくはない)に保存されている写真は一旦メモリにロードされる。CPUはメモリからそのデータを読み出しつつ、圧縮されたデータのデコードを行う。それらのデータはディスプレイドライバに送られる。図で言うと、「SSDやハードディスク」→「メモリ (RAM)」→「CPUキャッシュ」→「CPUレジスタ」という経路をたどる。
なおCPUレジスタは主に計算結果などを一時的に一瞬だけ記憶しておくものであって、キャッシュ用途ではない。
動画は容量が大きく数百メガバイトからギガバイト単位に達するため、ストレージから読み込んだデータを全てRAMにロードすることはないし、CPUキャッシュに全てを読むことは不可能である。そのため、細かい単位で逐次上の階層に転送されている。
下の階層は遅いため、上がカバーする
図にも書いてあるが、階層の下の部分は非常に転送速度が遅い。例えばこういった感じだ。
CPU「キャッシュさん、データをくれ」
(10クロック後)
CPUキャッシュ「……ないな、RAMさん、データをくれ」
(100クロック後)
RAM「……………ないな、SSDさん、データをくれ」
(100000クロック後)
SSD「………………………あった!はい、どうぞ!」
(所要時間 100,110クロック)
クロックとはターン制ストラテジーでいうターンのようなもので、レジスタは命令を出して次のターンでデータを貰えるのに対し、メモリなどにデータがなくSSDまで取りに行かないといけない場合、命令を出して100000ターンの後にデータが返ってくるといった状況になる。
そのため、コンピュータの設計はよく使うデータを上の階層に持ってくることで無駄なターンの消費を避けている。一度読み込まれ、ファイルキャッシュに乗ってしまえば、以下のようになる。
CPU「キャッシュさん、データをくれ」
(10クロック後)
CPUキャッシュ「……ないな、RAMさん、データをくれ」
(100クロック後)
RAM「……………はいどうぞ!」
(所要時間 110クロック)
こうすることで無駄な時間の消費を避けられるということだ。
「メモリ解放」すると、ファイルキャッシュなどが消される
しかしながら、メモリ解放などといった無駄なことをすると、ファイルキャッシュよりもアプリに割くメモリを確保するために、ファイルキャッシュが消されてしまう。消したこの分が空きに回ったわけだが、ファイルのキャッシュが消されたことによって、同じファイルを読み出す際にはまた下の階層から引っ張ってくる必要がある。
同じデータを使う場合がそんなにあるのか?ファイルキャッシュは無駄なのでは?と思う人もいるかもしれない。しかし、コンピュータでは同じデータを使うことが本当に多いのである。だからこそこうした記憶装置の階層が考えられており、空いているメモリをキャッシュに使うというのも、こうした理由からだ。
だから、見かけ上のメモリの空きを増やすことに意味はないし、むしろ有害とも言えるのである。
確かに普通の感覚で言えば、ストレージやSDの空き容量と同じように、空きが多いほど良いと思えるかもしれない。しかし、メモリの空きはそうとも言えないのである。