‘Virtual memory exceeded’というエラーメッセージが表示された場合は、C-x s
(save-some-buffers
)で変更されたバッファーを保存してください。この方法は、バッファーを保存するのに最小限の追加メモリーを必要とします。Emacsはこのエラーが発生したときでも利用可能な予備メモリーを保持しており、それはC-x
sが処理を完了するのに充分なはずです。予備メモリーを使用したとき、モードラインの先頭に‘!MEM
FULL!’が表示された場合、それは予備メモリーも使い切ったことを意味します。
変更されたバッファーを変更したら、このEmacsセッションを終了して別のセッションを開始するか、M-x kill-some-buffersを使用して、カレントEmacsジョブのスペースを開放できます。これにより充分なスペースが開放された場合、予備メモリーは再充填され、モードラインから‘!MEM FULL!’の表示が消えます。これは同じEmacsセッションで、安全に編集を継続できることを意味します。
メモリー不足のときは、バッファーの保存やkillにM-x buffer-menuを使用しないでください。Buffer Menuはかなりの量のメモリーを必要とするので、予備メモリーの供給では不充分でしょう。
GNU/Linuxシステムでは、Emacsがメモリー不足(out-of-memory)という状況の通知を受け取ることは通常はありません。かわりにEmacsプロセスがメモリー不足になると、OSがEmacsをkillするかもしれません。これはout-of-memory
killer、あるいはOOM
killerという名前で知られている機能です。この動作が効力をもつ際にはメモリー不足という状況をEmacsがすぐに検知することはできず、上述のようなバッファーの保存をあなたに促すことはできないでしょう。ただしOSのこの動作をオフに切り替えることは可能であり、そうすればEmacsがkillされてしまう前に、メモリー不足という状況をもっと有益なやり方で処理するチャンスが生まれます。これを行うにはスーパーユーザーになり、以下の行を/etc/sysctl.conf
に含めてから、シェルプロンプトでコマンドsysctl -pを呼び出してください:
vm.overcommit_memory=2 vm.overcommit_ratio=0
上記のセッティングはシステム上の全プロセスに影響を与えること、そしてメモリー負荷が高いシステムでは、Emacsプロセスに限定されない一般的な動作であることに注意してください。