エラーメッセージ ‘Virtual memory exceeded’
が表示された場合は、変更したバッファを C-x s (save-some-buffers)
として保存してください。この保存方法は、追加メモリの必要量が最も少なくて済みます。Emacs
はこのエラーが発生した際に利用できるよう、メモリの予備を確保しており、それで C-x s
が処理を完了させるのに十分なはずです。予備を使い切ると、モードラインの先頭に ‘!MEM
FULL!’ が表示され、予備がもうないことを示します。
変更したバッファを保存したら、このEmacsセッションを終了して別のセッションを開始するか、M-x kill-some-buffers を使用して現在のEmacsジョブの空き領域を確保できます。これで十分な空き領域が確保されると、Emacsはメモリリザーブを再充填し、モードラインから ‘!MEM FULL!’ が消えます。これにより、同じEmacsセッション内で引き続き安全に編集を行うことができます。
メモリ不足時にバッファを保存または破棄する目的で M-x buffer-menu を使用しないでください。バッファメニュー自体にかなりのメモリが必要であり、予備のメモリでは不足する可能性があるためです。
GNU/Linuxシステムでは、通常、Emacsはメモリ不足の状態を通知されません。その代わりに、メモリが不足するとOSがEmacsプロセスを強制終了させることがあります。この機能はout-of-memory killer、またはOOM
killerとして知られています。この動作が有効になっている場合、Emacsはメモリ不足の状態を適時に検知できず、前述のようにバッファを保存することができなくなります。しかし、OSのこの動作を無効にすることで、Emacsが強制終了される前に、より有用な方法でメモリ不足に対処する機会を与えることができます。そのためには、スーパーユーザーになり、ファイル
/etc/sysctl.conf を編集して以下に示す行を記述し、シェルプロンプトからコマンド
sysctl -p を実行してください:
vm.overcommit_memory=2 vm.overcommit_ratio=0
なお、上記の設定はシステム上のすべてのプロセスに影響し、一般的にはEmacsプロセス単体ではなく、メモリ負荷下におけるシステム全体の挙動に影響を及ぼす点にご留意ください。