株式市場が世界レベルで大荒れのため、株価は惨憺たる状況ですが、Appleの業績は好調なようです。MacやiPhoneの販売台数大幅増のみならず、純利益が26%アップしているというのですから、絶好調といっていいでしょう。ただし、景気後退がささやかれる今、年末商戦は厳しいかも……3カ月後の報告を待ちましょう。

さて、今回は「スワップ防止対策」について。「第295回 メモリ激安の今、敢えて仮想メモリに思いを馳せる」では、OS Xのメモリ管理機構の仕様に起因するスワップファイル生成のプロセスについて説明したが、その対策について量的に不足していた感が否めない。そこで、事態の根本的な解決にはつながらないかもしれないが、情報を追加してみることにしよう。

OS Xのメモリ管理について (補足)

第295回では、アクティビティモニタに表示される用語を用いつつ、OS Xの"メモリ管理のクセ"について述べたが、もう少しわかりやすく説明しておきたいと思う。

まず、「メモリ領域をキャッシュ代わりに使う」ことがメモリ管理の基本姿勢として存在する。メモリは使わなければいたずらに電力を消費するだけの代物、遠慮会釈なしに使いまくり、足りなくなった時点で不要な領域を解放し再利用しようという寸法。アプリケーションが実行中に不要なメモリを解放することは基本的になく、解放しないまま終了してしまうものも多い。たとえは悪いが、日中は散らかし放題で来客など緊急時にのみ必要最低限の掃除を行うという筆者の書斎……もとい、独身男性の部屋を想像するといいだろう。

第295回で問題視した「Inactive→Freeの処理が行われない」ことは、このメモリ管理の基本姿勢に照らせばあながち誤りではない。ただ、消費量が物理メモリ容量の上限に達してしまった場合、スワップファイルが作成されてパフォーマンス低下を招いてしまう。対策としては物理メモリ領域を増やすことがベストだが、ハードの仕様等もあるためソフトで対応せざるをえない、ということだ。

コンパクション用ツールは?

ところで、OS Xのようにデマンド・ページング方式で (仮想) メモリ領域を管理するOSの場合、HDDと同様に「フラグメンテーション (断片化)」という現象が発生する。これを解消する処理はHDDの場合「デフラグ」というが、OSでは「コンパクション」と呼ぶことが一般的だ。前回紹介したdiskutilコマンドは、ファイルのパーミッションを修正する処理の過程で、副次的にコンパクションのような効果をもたらしているに過ぎない。

本格的なコンパクション的機能を期待するならば、やはり専用ツールに頼るしかないだろう。数は少ないが、比較的知られているものにはシェアウェアの「iFreeMem」がある。メモリを大量に消費し他のアプリが抱えるキャッシュを解放させ、それを取り込んだうえでまとめて解放するという強引さが特徴のこのツール、diskutilコマンドより効果的なうえ処理も速いので、メモリの断片化が進むたびにOS Xを再起動するのは面倒、という向きにはお勧めだ。

iFreeMem実行前(左)と実行中(中)、実行後 (右) のメモリ領域。レジスト費用は10ポンド(約1,600円)、15日間の試用が可能だ

メモリ喰い「Safari」とうまく付き合う

OS X 10.5.5の現在、もっとも多くのユーザに利用されている"メモリ喰い"アプリケーションは「Safari」だろう。起動直後は80MB程度だが、サイトへのアクセスを重ねるたび、新規タブを開くたびにメモリ消費量が増えていく。気がつけば500MB超という状況も、決して珍しいことではない。とはいえ、Safariに致命的なメモリリークが存在し、長年にわたり放置されているというわけでもない (はず)。

その原因の1つが「キャッシュ」だ。Safariは再表示時のパフォーマンスを上げるために、一度読み込んだ画像などのコンテンツをメモリ上に残しておく。フォントも同様に、アウトラインフォントから生成したビットマップイメージを残しておく。ファビコンもまた然り。つまり、[Safari]→[キャッシュを空にする...]を選択し、キャッシュを消去すればメモリは一部解放される。

そしてもっとも効果的なのは「終了」。Safariを終了すれば、メモリの大部分は解放され、空きエリアが一気に増える。いまのところ他に特効薬はなく、アクティビティモニタやvm_statコマンドで頃合いを見計らいながら、定期的に終了 / 再起動させるしかない。

ところで、アドオン機能の有無はメモリ消費量にさほど影響しないようだ。Coolirisなどいくつかのアドオンで試してみたが、使用量が数MBほど増えることはあるものの、利用時間が長くなるにつれキャッシュが逓増することに比べれば微々たるもの。そのまま使い続けて差し支えないだろう。

「アクティビティモニタ」で不要なプロセスをKILL

小物を積み重ねるという手もある。アクティビティモニタやpsコマンドで不要なプロセスを見つけ出し強制終了 (kill) 、少しでもメモリ空間を確保する、というオーソドックスな手法だ。ただし、プロセス名で判定しなければならないため、腕に覚えのあるユーザでなければ厳しいかもしれない。

筆者が目を付けたのは「GoogleSoftwareUpdate」。Google DesktopなどGoogle謹製のフリーウェアとともにインストールされ、以後プロセスとして常駐しアップデート情報をチェックするようになるが、Google Desktopはあまり使わないので必要ない。しかし、killしても再起動すれば自動実行されてしまう……ということで、アンインストールした。念のためコマンドラインを示しておくので、Google Desktopに縁がなかった場合には試してほしい。

$ sudo /Library/Google/GoogleSoftwareUpdate/GoogleSoftwareUpdate.bundle/Contents/Resources/GoogleSoftwareUpdateAgent.app/Contents/Resources/install.py --uninstall