私はJavaプロセスがゾンビになってしばらくそこにとどまった生産単位を持っています。端末を再起動すると削除されます。ただし、デバイスは再起動せず、他のJavaプロセスが起動して実行されます。このゾンビの状態がクリアされず、そのまま残っていれば問題ありませんか?どのように(パフォーマンスやスピードの低下)影響を与えますか?
答え1
ゾンビプロセスはパフォーマンスや速度には影響しません。ゾンビプロセスはシステムリソースを占有しません。
メモ:- 実際に制限されたリソースであるPIDを引き続き使用し、プロセスのカーネルデータ構造を割り当てます。一般に、これは重要ではありませんが、メモリが非常に制限されているシステムでは、カーネルのメモリ使用量がかなりの場合があります。
ゾンビプロセスによる問題
各ゾンビプロセスは対応するプロセスIDを保持します。 LinuxシステムのプロセスIDの数は制限されています。3276732ビットシステムでは、基本的に。ゾンビプロセスが非常に高速で蓄積されると、利用可能なPIDプール全体が最終的にゾンビプロセスに割り当てられ、他のプロセスが開始されなくなります。
ノート:64ビットシステムでは、最大PIDを増やすことができます。https://unix.stackexchange.com/a/16884/170373
ただし、システムの親プロセスに問題があることを示していても、ゾンビプロセスがいくつか残っているのは問題ありません。
説明する:
Linuxでプロセスが終了すると、メモリからすぐに削除されません。対応するプロセス記述子はメモリに残ります。
プロセスの状態が変更されEXIT_ZOMBIE
、この信号はプロセスの親プロセスに子プロセスが終了したことを知らせますSIGCHLD
。
その後、親プロセスは wait() システムコールを実行し、終了状態および終了したプロセスに関するその他の情報を読み取る必要があります。これにより、親プロセスは死んだプロセスから情報を取得できます。wait() を呼び出した後、ゾンビプロセスはメモリから完全に削除されます。
これは通常非常に迅速に発生するため、システムにゾンビプロセスが蓄積しているのを見ることはできません。ただし、親プロセスが正しくプログラムされず、wait()を呼び出さないと、そのゾンビ子プロセスは消去されるまでメモリに残ります。
解決する:
SIGKILL信号を使用して通常のプロセスを終了できるため、ゾンビプロセスを終了できません。ゾンビプロセスはすでに終了しています。
ゾンビプロセスを終了する1つの方法は、SIGCHLD信号を親プロセスに送信することです。このシグナルは親プロセスにwait()システムコールを実行し、ゾンビの子プロセスをクリーンアップするように指示します。 kill コマンドを使用してシグナルを送信し、次のコマンドの pid を親プロセスの PID に置き換えます。
kill -s SIGCHLD pid
ゾンビプロセスの作成が完了すると、initはゾンビプロセスを継承し、新しい親プロセスになります。 (initはLinuxで起動時に開始される最初のプロセスで、PID 1が割り当てられます。)
メモ:-Linux 3.4以降、プロセスはPR_SET_CHILD_SUBREAPERオプションを使用してprctl()システムコールを実行し、プロセス#1ではなく孤立した子プロセスの親になることができます。引用: https://unix.stackexchange.com/a/177361/5132
その後、INITはwait()システムコールを実行してゾンビサブプロセスをクリーンアップするので、initはゾンビプロセスをすばやく処理できます。親プロセスを閉じた後に再起動できます。
答え2
ほとんどの場合、ゾンビは大きな問題ではありません。彼らは「死んだ」プロセスであり、CPU時間や割り当てられたメモリを占有しません。しなければならない死ぬ前にこのプロセスを通して解放されます。彼らが実際に占める唯一のリソースはプロセスリストのエントリです。システムによって許可されるスレッドの最大数を指定できます。ゾンビがあれば、何らかの理由でこの制限に早く到達できます。
ただし、ゾンビは通常、プログラマが間違っているか、欠陥のあるコードが原因で発生します。忘れる子プロセスの状態を確認してください。これは意図的なものかもしれませんが、一般的にそうではありません。バギー/バギーコードは、誤った方法でメモリを処理することがよくあります。 特別な方法、そしていいえ割り当てられたリソースを解放します。この場合、これらのリソースは、ゾンビが完全にシャットダウンされるまでゾンビに割り当てられたままになります。
編集する:プロセスがJavaプログラムの場合、Javaガベージコレクタはすべてを処理するため、メモリを解放しなくても問題はありません。