Macのメモリをちょっとだけ空ける方法を試してみたら、結構快適になった
が、眠いので続きは起きたら書くよ…@4:21
さて、Macのメモリ管理ってなんかイマイチよくわからん動きをするよね。と思うことがある。
odawaraはMacbook Air(たぶん初期型)のメモリ2GBのやつを使っているのだけど、起動してしばらく使っていると
↑みたいな状態になる。この状態では、空きメモリが無くなって、固定中と現在使用中と現在非使用中の3つに占有されている。これ自体は普通なのだけど、このままブラウザのタブなんかを開くと、やたらと操作が重たくなる。
この時の動きとしては、使用中や非使用中の領域を徐々にスワップさせていきながら、空きメモリを確保しているんだろう。この動きがどうにも良くない。遅くなり方が顕著すぎる。
Windowsとかだと、キャッシュしたメモリ(MacOSの非使用中の領域と同等だと思っているんだけど、違ったらツッコミを)はすぐに解放されて無くなるんだけど、MacOSは無くならない。スワップしてるのに、非使用中の領域が残ってる。これを何とかしたい。
それで色々やってみた結果、非使用中領域が消えないっぽいのがわかった(MacOSインサイダーみたいな本がほしいな…)じゃあ非使用中の領域をごっそりスワップ領域に持って行けばいいんじゃね?
と思って、組んだプログラムがこれ。
mem_clean.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE (1024 * 1024 * 1024) int main(void){ int *buf; buf = (int*)malloc(SIZE); if(buf==NULL){ printf("Memory alloc error.\n"); return 1; } memset(buf,0,SIZE); free(buf); return 0; }
Airの搭載メモリが2GBなんで、確保するメモリは適当に1GBとしています。ビルドして実行
$ gcc -o mem_clean mem_clean.c $ ./mem_clean
死にます(笑)←うそ
メモリの様子を見てみましょう。
という感じにきれいに。スワップ使用領域はかなり増えてるんだけど、全体の動きは軽快になる。いったん非使用中領域を無くすと、それ以降はなかなか増えていかないようで、事実上非使用中となっていたメモリの容量分が増えたような感じになって、全体的に非常に快適。これはなかなかいい。
MacOSでこんな動きが気になった方、お試しあれ。
初出時、
buf = (int*)malloc(SIZE);
で1GB mallocして、
memset(buf,0,SIZE*sizeof(int));
4GB memsetして死んでたとか、恥ずかしいからナイショだぜ(笑)