У меня есть утилита, где Jmeter отправляет запрос, и утилита отправляет ответ на Jmeter. Когда загрузка увеличивается, утилита отключается с помощью «EXCEPTION_ACCESS_VIOLATION».Почему мой процесс висит на input.readLine()?
Поскольку это ошибка, я не могу обработать ее в блоке catch. Я сделал вторую утилиту для перезапуска первой утилиты при возникновении ошибки. Ниже приведен код второго, перезапуска, утилиты. В этом коде второй утилиты, на секунд, а, моя программа иногда зависает. Как это обнаружить и перезапустить процесс?
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. Что нужно делать?
Вы можете обработать ошибку в блоке 'catch', добавив блок catch для catch класса' Error' в дополнение к 'Exception' или просто' Throwable', если это тестовый код. См. Здесь для получения дополнительной информации: http://stackoverflow.com/questions/15190164/catching-all-java-lang-error-for-logging-purposes-and-allowing-them-to-work-thei – JoshDM
Но где положить catch блок для ошибки. Это может нарушить нормальный поток программы. – Deepak
На данный момент целью является попытка захвата трассировки стека ошибки. Самый простой способ сделать это - заменить '(Exception e)' на '(Throwable e)'; правильный способ сделать это состоит в том, чтобы добавить второй блокирующий блок после существующего для 'catch (Error err)'. – JoshDM