Macのメモリの話

====

**自分はメモリの空き容量がたっぷりあると、幸せな気分になります。**
なので、[Macのメモリを自動的に開放してくれる『Memory Clean』が便利！](http://www.lifehacker.jp/2013/01/130120macmemory_clean.html)という記事を読み、ほうほうと思い[MemoryClean](https://itunes.apple.com/jp/app/memory-clean/id451444120?mt=12&ign-mpt=uo%3D4)をインストールしました。

MemoryCleanの挙動の話
----
さてどんな挙動するのか、アクティビティモニタを眺めつつ実行させてみます。
[動画(youtube)](http://www.youtube.com/watch?v=H4aVJnj_9ks&feature=youtube_gdata_player)


![clean前](https://www.evernote.com/shard/s3/sh/7f1ed916-b338-422c-b402-9c867bfd762d/9f69cd9b9bafd3474dc377908b233b0c/res/5034d4bf-5e07-498d-8be5-9270535418e8/skitch.png)
↓
![clean中](https://www.evernote.com/shard/s3/sh/e4f2a676-5978-443a-9a38-2a9835927124/c540cc05e1b13906cc429581b44ebd41/res/f26e73cc-3175-42fc-b4cf-792f810f9f01/skitch.png)
↓
![clean後](https://www.evernote.com/shard/s3/sh/2d475623-65ec-4225-97c6-a219ceff7b50/5746f9b0398685f923cb66a86c258aa0/res/833bce71-31d3-4dd4-bd19-cae012c21c98/skitch.png)

つまりこのアプリの挙動は、「メモリを大量にallocする事で、ファイルキャッシュを追い出して、使ってないメモリをswapに追い出す」事で、空きメモリ領域を広げるようです。荒っぽいなぁ。

ファイルキャッシュを追い出すのは影響少ないとは思うものの、swapに追い出されたメモリを使ってるアプリは、この後アクティブになったタイミングで、swapからメモリに戻すために「もっさり」するような気がします。
またレビュー欄にあるとおり、「swapファイルを使わない設定にしてると悲惨なことになる」は正しいと思います。

でもまぁ、**メモリ空き容量の数字が増えるのは、幸せな気分になるので良しとします。**

メモリの種類の話
----
ここで自分が、メモリの「現在使用中」「現在非使用中」が何だったかな、と思ったので調べてみました。
[Appleのドキュメント](http://support.apple.com/kb/HT1342?viewlocale=ja_JP)から引用します：

```
固定中：
Mac のドライブに移動できない RAM の情報 。固定中メモリのサイズは、実行中のアプリケーションによって異なります。

現在使用中：
RAM 内にあり、最近使われた情報です。

現在非使用中：
この情報は最近使われて RAM 内にありますが、現在は使われていません。
たとえば、Mail を使った後終了した場合、Mail が使っていた RAM は、「現在非使用中」としてマークされます。現在非使用中メモリは、空きメモリと同じように、ほかのアプリケーションで利用できます。ただし、現在非使用中メモリがほかのアプリケーションによって使われる前に Mail を開いた場合、RAM より遅いハードドライブから Mail をロードする代わりに、Mail の現在非使用中メモリが現在使用中メモリに変換されるため、Mail はすばやく開きます。
```
topコマンドと照らし合わせると、固定中(=wired) 現在使用中(=active) 現在非使用中(=inactive) に対応しています。
固定中(=wired)はOS等の重要な、swapに吐き出せない部分なのでしょうね。
MemoryCleanの挙動を見ると、現在使用中(=active)のメモリはswapに吐き出される（ページアウト）する可能性のある領域のようです。

現在非使用中(=inactive)には、たしかファイルキャッシュも含まれてたはずなので、それの確認をします。

現在非使用中メモリとpurgeコマンドの話
----
メモリ上のファイルキャッシュは、何らかのアプリケーションでファイルを読み出すとその分増えていくはずなので、catコマンドで大量のファイルを読み込ませ現在非使用中メモリが増えるかどうか、確認します。

```sh
macmini% top -l 1 | grep PhysMem
PhysMem: 1092M wired, 1262M active, 707M inactive, 3061M used, 5131M free.
macmini% find ~/ -type f -exec cat {} > /dev/null \;
^C
macmini% top -l 1 | grep PhysMem                    
PhysMem: 1089M wired, 1283M active, 5778M inactive, 8150M used, 41M free.
macmini% 
```

inactiveが707M → 5778M ときっちりと増えてくれました。

メモリ上のファイルキャッシュを削除するには、purgeコマンドを使います。これはXCodeのCommandLineToolsでインストールされます。実行するとOSが少し固まります。

```sh
macmini% top -l 1 | grep PhysMem
PhysMem: 1092M wired, 1347M active, 5721M inactive, 8160M used, 30M free.
macmini% purge
macmini% top -l 1 | grep PhysMem
PhysMem: 1089M wired, 1203M active, 667M inactive, 2959M used, 5232M free.
macmini% 
```
purgeコマンドで、5721M → 667M と、だいぶ元にもどりました。ファイルキャッシュでないものも含まれてるためか0Mになるわけでは無いようです。Appleのドキュメントにある「Mail等のアプリ」のバイナリなのかもしれません。まぁ大体納得できる値まで減ります。

ちなみにググっていると、[purgeコマンドの代わりにduを使ってる方](http://tukaikta.blog135.fc2.com/blog-entry-228.html)もいました。キャッシュされたファイルのパスによるかもしれませんが、たしかにduでもinactiveが減るのを確認出来ました。

```sh
macmini% top -l 1 | grep PhysMem                    
PhysMem: 1237M wired, 1708M active, 731M inactive, 3676M used, 4515M free.
macmini% find ~/ -type f -exec cat {} > /dev/null \;
^C
macmini% top -l 1 | grep PhysMem                    
PhysMem: 1237M wired, 1668M active, 5129M inactive, 8034M used, 158M free.
macmini% du ~/ > /dev/null                          
^C
macmini% top -l 1 | grep PhysMem
PhysMem: 1239M wired, 1668M active, 734M inactive, 3641M used, 4551M free.
macmini% 
```

swapの話
----
MemoryCleanで遊んでたら、いくつかのページがswapに押し込まれてしまったので、これを実メモリに戻したい所です。ですが調べたものの、"実メモリに戻してswapを0にする"方法は見つかりませんでした。詳しい仕組みは分からないので深追いしないことにします。

* Macのswapは dynamic_pager というデーモンが管理している。man dynamic_pager でいろいろ見られる。
 * swapfileは/private/var/vm/以下に生成される。
* でもその中に「swapを0にする」等は見当たらない
* ググっても「一度swapしたページは戻ってこない」という情報しか出てこない。
 * これは理解不足なだけで、「swapファイルのサイズは0に戻らない」だけなのかもしれない(=ページインして戻ってきてるけど確認出来ない等）
* [swapon/offが出来れば良いのに](http://blog.livedoor.jp/dankogai/archives/51101101.html)に激しく同意。

結論
----
**こんな細かい所が気にならないだけのメモリがあれば、幸せになれる。**