Jmeter がリクエストを送信し、ユーティリティが Jmeter に応答を返すユーティリティがあります。負荷が増加すると、ユーティリティは「EXCEPTION_ACCESS_VIOLATION」でシャットダウンします。
エラーなのでcatchブロックでは扱えません。エラーが発生したときに最初のユーティリティを再起動するための 2 つ目のユーティリティを作成しました。以下は、2 番目の再起動ユーティリティのコードです。この 2 番目のユーティリティのコードでは、2 番目の whileで、プログラムがハングすることがあります。これを検出してプロセスを再起動するにはどうすればよいですか?
public static void main(String[] args)
{
String line = null;
String currPID = null;
try
{
while(true)
{
Process process = Runtime.getRuntime().exec("java -XX:+HeapDumpOnOutOfMemoryError -Xms250M -Xmx500M -XX:ErrorFile=NUL ws ");
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((line = input.readLine()) != null) //Program stucks at this Line
{
if(line.trim().length() != 0)
{
if(line.startsWith("PID"))
{
currPID = line.substring(line.indexOf("@")+1);
}
}
}
System.out.println("Ended");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
2番目の(再起動)ユーティリティを起動すると、2つのJavaプロセスが実行モードになっていることがわかりました。最初のユーティリティが定期的に再起動していることがわかります。これは、その PID が jvisualvm で頻繁に変更され、タスク マネージャーでも同じことが起こっているためです。すべてが非常に順調に進んでいます。
しばらくして、Jvisualvm、つまり2番目の(再起動)ユーティリティにプロセスが1つしかないことがわかりました。これは、最初のユーティリティ JVM がクラッシュしたことを意味します。ここで異常なことが起こっています。JVMがクラッシュした場合は再起動する必要があるためです。だから私はタスクマネージャーを開いて、そこに最初のユーティリティPIDが存在することを発見しましたが、起動時に起こっているように変化していません。タスクマネージャーから明示的にプロセス(最初のユーティリティ)を強制終了した場合。Seconds ユーティリティが再び最初のユーティリティを再起動すると、同じことが再び起こります。しばらくすると、最初のユーティリティが jvisualvm から消え、タスクマネージャに存在し、タスクマネージャからプロセスを削除します。何をする必要がありますか?