gpt4 book ai didi

java - 为什么我的进程在 input.readLine() 处挂起?

转载 作者:行者123 更新时间:2023-11-29 03:29:18 25 4
gpt4 key购买 nike

我有一个实用程序,其中 Jmeter 发送请求,实用程序将响应发送回 Jmeter。当负载增加时,实用程序将关闭并显示“EXCEPTION_ACCESS_VIOLATION”。

因为这是一个错误,我无法在 catch block 中处理它。当错误发生时,我制作了第二个实用程序来重新启动第一个实用程序。下面是第二个重新启动实用程序的代码。在第二个实用程序的代码中,在 second 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,但它并没有像启动时那样发生变化。如果我从任务管理器中明确终止进程(第一个实用程序)。第二个实用程序再次重新启动第一个实用程序同样的事情再次发生,一段时间后第一个实用程序从 jvisualvm 中消失,存在于任务管理器中并从任务管理器中删除进程。需要做什么?

最佳答案

尝试使用 .ready() 函数。

try {
if (stdError.ready())
{
while((line= stdError.readLine()) != null){
logger.error(line);
}
}
}

对标准输出做同样的事情。

它对我来说就像一种魅力。

关于java - 为什么我的进程在 input.readLine() 处挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19225079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com