Mac初心者に送るMacのメモリ管理について



## 記事の経緯
会社でパソコン遅い！って言ったらスワップアウトしてるか調べてみて、と言われて「スワップアウト？？」となり、いろいろ調べた結果わかったことをまとめました。
対象読者はメモリについてなんとなくわかっている、レベルのMacユーザーの方です。
他のパソコンも同様のメモリ管理だと思いますが、アクテビティモニタなどの見方については、完全にMacユーザー向けとなるので、ご了承くださいm(_ _)m

ちなみにパソコン思いと精神衛生的に悪影響なので、早めの買い替えもしくは転職をおすすめします。

## メモリ使用量について把握する
多くの方は知ってるかと思いますが、Macの場合は標準で搭載されているアクテビティモニタでメモリやCPUの仕様状況を見ることが出来ます。
上の項目でメモリを選択すると、各プロセスにおけるメモリの使用状況がわかります。

![Kobito.MKDdBw.png](https://qiita-image-store.s3.amazonaws.com/0/135757/7e53c87c-a07a-58b3-bb02-a2318b06d03d.png "Kobito.MKDdBw.png")

![Kobito.uzuLv8.png](https://qiita-image-store.s3.amazonaws.com/0/135757/8a9e7a8a-3eec-5673-228e-5fca1ce98b69.png "Kobito.uzuLv8.png")

### 具体的なメモリの見方

初心者の方はここまでわかる方も多いと思います。自分もパソコン使い始めから、アクテビティモニタでメモリを見てきました。
しかし、メモリの詳細について、あまり理解していませんでした。

![Kobito.dARydN.png](https://qiita-image-store.s3.amazonaws.com/0/135757/739ae6c7-269d-dd85-bc0d-c2adde8e3c99.png "Kobito.dARydN.png")

ここに、４つの項目があります。「物理メモリ」、「使用済みメモリ」、「キャッシュされたファイル」、「スワップ使用領域」そして、使用済みメモリについて、さらに細かく「アプリケーションメモリ」、「確保されているメモリ」、「圧縮」というふうに細分化されています。
これらについて簡単に説明していきます

- **物理メモリ（RAM：Random Access Memory）**：実際に搭載しているメモリの大きさ
- **使用済みメモリ**：アプリケーションが使用しているメモリ
- **キャッシュされたファイル**：アプリケーションにより最近使用されたが、現在はほかのアプリケーションが使用可能なメモリ
- **スワップ使用領域**：スワッピングに使用するために確保している領域


- **アプリケーションメモリ**：アプリケーションが実際に使用しているメモリ
- **確保されているメモリ**：圧縮またはスワッピングできないメモリ
- ** 圧縮**：ほかのプロセスがより多くの RAM メモリを使用できるようにするために、RAM 内で圧縮されているメモリの容量。圧縮されているメモリの容量をプロセスごとに確認するには、「メモリ圧縮」列を調べます。
圧縮は、OS Mavericsから登場したようで、これによってメモリ管理アプリを使用することなく、メモリを勝手に圧縮して管理してくれるようです。メモリが足りなくなってきたら、自動的に使われていない圧縮したメモリを消していくようです。

## パソコンが遅いとは
パソコンの動作が通常よりも遅くなることを「重い」とか「遅い」といいますが、これは、メモリが足りないため、スワッピングしている状態です。

## スワッピングとは
詳しい説明は別のページに譲り、ここでは簡単に説明します。
プロセスを実行するためにはメモリが必要です。それでは、そのメモリが足りなくなった場合どうするでしょう。
ひとつのやり方としては、他のメモリを使用しているプロセスを終了させることです。しかし、どうしてもそのプロセスを終了させたくない場合はどうするのか。それは、ディスク上にメモリを退避させ仮想的にメモリを作成し、使用することです。
これはメモリをディスク上に作成し、仮想的に使用することで、メモリが足りない状況でもプロセスを実行することができます。これを**仮想メモリ（Virtual Memory）**と呼びます。日本語的に理解できずパソコン購入当初の自分はここで混乱しました。
メモリをディスク上に退避させることを**スワップアウト、またはページアウト。**仮想上のメモリを物理メモリに書き戻す動作を**スワップイン、またはページイン。**そのようなメモリとディスクを行き来する動作の総称を**スワッピング**もしくは**ページング**といいます。

### 例え話
ここにネコのアプリケーションがあって、メモリ１GBを消費するものとします。パソコンにある実メモリが8GBに対して、ネコのアプリを９個実行使用とすると、メモリが足りません。
その時、パソコンにあるSSDに１GBをスワイプアウトして、９個アプリが利用できるようになりました！

![Artboard.png](https://qiita-image-store.s3.amazonaws.com/0/135757/e1a1c955-6f83-fdf8-a8e4-37b75abe8e87.png "Artboard.png")



しかし、デメリットもあります。それは、遅延が生じるということです。元々ディスクはメモリ用ではないため、メモリを読み込み行ったり書き込む際に、普通のメモリとくらべて時間がかかります。
また、ディスクがHDDかSSDかによって、そのスピードも変わってきます。SSDのほうがすごい早いです。

先程言っていたスワップ使用領域は、ディスク上に作られたスワップファイルの領域です。
場所は``/private/var/vm/``にあります

## スワッピングするタイミング
スワップファイルが作られているからといってスワッピングしているとは限りません。
それではどうやって把握すればいいのでしょうか。

見方としては簡単で、先程のアクテビティモニタで使用済みメモリとキャッシュされたファイルの量が合計で物理メモリより上回っていたらスワッピングしています。

## メモリプレッシャー

アクテビティモニタにはメモリプレッシャーという、どれだけパソコンに負荷がかかっているかというグラフがあります。
[公式ページ](https://support.apple.com/en-us/HT201464)
こちらのメモリの項目について読むと、グラフの色によって、いまメモリの状態がどのようであるかがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/135757/f966dffe-609f-0686-2bd7-eca6ef6465de.png)


- 緑：メモリは使用可能
- 黄色：メモリは使用可能だけど、メモリ管理プロセスでタスクが実行されています。
- 赤：メモリ使用可能領域がなくなりました。OSは起動ドライブを仮想メモリとして使用しています。使用可能なRAMを増やすか、アプリを消してください。これはあなたのMacのメモリが足りていないことを示す重要な指標です。

（多くのMac製品は個人でメモリ増設ができないので、新規購入しろ、ということを暗に言いたいのか・・・）

### スワップ使用領域を減らすには
スワップ使用領域は再起動することで、リセットされます。しかし、初期起動時にもすでに数百Mバイトのスワップファイルが作成されています。
また、スワッピングが使用されるのは、物理メモリが足りなくなったときなので、ストレージが足りないとき以外はそこまで考慮する必要は無いと思います。

### キャッシュされたファイルの節約
キャッシュすることで、アプリケーションの再起動などが早くなるのですが、使わないものであれば、無駄にメモリを専有しているため、なくしたほうが良いです。

キャッシュを削除するには、ターミナルから``sudo purge``してみてください。キャッシュされたファイルの量が一瞬で減ることが確認できます。

## まとめ
スムーズにパソコンを動作させたい場合は、メモリの使用量に注意して普段から管理してください。
SSDの登場によって、スワップアウトしてもHDDよりは遅延が少なくなりましたが、それでもしないほうがもちろん良いです。
そして仕事で使用するPCのHDDでスワップアウトしてしまって作業効率が落ちているなら、上長に報告してマシンスペックをあげてもらいましょう。パソコンが遅いとめちゃめちゃ精神的につかれ、精神衛生上よくないです。
**マシンスペック上げれないような会社であれば、転職しましょう。仕事道具に投資しない会社なんてそれまでの会社です。同じ能力で同じ作業をしてもパソコンが遅いだけでその分ライバルと遅れがでているのです。**


## 参考
- [Mac でアクティビティモニタを使う - Apple サポート - Apple Support](https://support.apple.com/ja-jp/HT201464)
- [「アクティビティモニタ」で Mac のメモリ使用状況を表示する](https://support.apple.com/ja-jp/guide/activity-monitor/actmntr1004/mac)