これは、プログラムがkill -9
他のプログラムまたはスクリプトから取り込まれた場合に発生します。
一般的なミステリアスなプロセス キラーの 1 つは、Linuxのメモリ不足 (OOM) キラーです。Linux では、プログラムがあまりにも多くのメモリを割り当てると、 から NULL が返されなかっmalloc()
たり、new
オペレーターから例外が返されたりしません。代わりに、あなたのプログラムはおそらくkill -9
カーネルによって処理されます。
OOMキラー
Linux には、要求を満たすのに十分なメモリがない場合でも、プロセスが必要なだけ多くのメモリを割り当てることができる、奇妙な (しかし賢明な) ポリシーがあります。これは、多くのプログラムが楽観的に大量のメモリを割り当てますが、実際にはそのすべてのメモリを使用しないためです。Linux では、プログラムは好きなように割り当てることができ、そのメモリにアクセスしようとした場合にのみ、Linux はメモリの存在を確認します。
そうでない場合、カーネルはメモリが使用可能であることをプログラムに通知した (つまりmalloc()
、以前に有効なポインターを返した) ため、カーネルはバインドされていますが、現在は嘘に引っかかっています。プログラムにエラーを通知する良い方法はありません。エラーが発生しました。以前に NULL を返す必要がありました。
ここで、OOM キラーの出番です。OOM キラーは、フライトをオーバーブッキングした航空会社のようなもので、料金を支払っている顧客にそのフライトに乗らないよう説得する必要があります。あなたがお金を払ったことは知っていますが、もしかしたら誰かが親切にも後のフライトに乗ってくれるでしょうか?
カーネルはメモリ要求を満たすことができないので、何ができるでしょうか? 「ごめんなさい、嘘をつきました」と言って、現在のプログラムを強制終了することができます。または、現在のプログラムに十分な空き容量ができるまで、他のプログラムを強制終了してメモリを解放することもできます。OOM キラーは、悪い状況をうまく利用しようとします。被害を最小限に抑えるために、どのプログラムを強制終了するのが最適かを判断しようとします。新たに開始されたプログラムが大量のメモリを消費している場合、それが殺されます。これは理にかなっています。プログラムにバグがあり、メモリの割り当てが多すぎる可能性があります。
または、別の可能性を考えてみましょう: あなたのプログラムはまったく問題がありませんが、他のプログラムが正しく動作せず、OOM キラーがあなたのプログラムを強制終了することにしました。
これが起こっているかどうかはわかりません。しかし、「私のプログラムが理由もなく殺されている」と聞くと、私はOOM killerだと思います。