我有一个实用程序,Jmeter 发送请求,实用程序将响应发送回 Jmeter。当负载增加时,实用程序会以“EXCEPTION_ACCESS_VIOLATION”关闭。
由于这是一个错误,我无法在 catch 块中处理它。当错误发生时,我创建了第二个实用程序来重新启动第一个实用程序。下面是第二个,restart,实用程序的代码。在第二个实用程序的代码中,在第二个 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();
}
}
我通过 jvisualvm 分析了进程,当我启动第二个(重新启动)实用程序时,我发现两个 java 进程处于运行模式。我可以看到第一个实用程序正在定期重新启动,因为它的 PID 在 jvisualvm 中经常更改,并且在任务管理器中也发生了同样的情况。一切都进行得很好。
一段时间后,我发现 Jvisualvm 中只有一个进程,即第二个(重新启动)实用程序。这意味着第一个实用程序 JVM 只是猜测不确定。这里发生了一些不寻常的事情。因为如果JVM崩溃了,那么它应该重新启动。所以我打开任务管理器,发现那里存在第一个实用程序 PID,但它并没有像启动时发生的那样改变。如果我从任务管理器中明确终止进程(第一个实用程序)。Seconds 实用程序再次重新启动第一个实用程序同样的事情再次发生,一段时间后第一个实用程序从 jvisualvm 中消失,存在于 taskmanager 中并从 taskmanager 中删除进程。需要做什么?