Я написал программу java, которая считывает данные из COM-порта в своем потоке и помещает его в базу данных. Когда происходят исключения (база данных или com), он перезапускает себя с помощью runtime.exec. Через день или около того программа иногда замерзает. Я не могу отслеживать, когда это происходит точно, но похоже, что это произойдет через некоторое время. Кто-нибудь из вас знает, что может быть проблемой? Спасибо!Java-программа Freezes
ответ
Если вы просто поймаете исключения IO и выполните runtime.exec, вы можете избавиться от памяти из-за слишком большого количества JVM ... Вы уверены, что старая программа (и JVM) полностью исчезла при выполнении нового Runtime.exec? То есть, как сказал @extraneon, вы уверены, что ваша программа не создает другой экземпляр вашей программы, который, в свою очередь, создает еще один экземпляр вашей программы ...?
Пожалуйста, обратитесь сюда: http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/sys_hangs.html
В зависимости от того, как вы реализуете ваше программное обеспечение, которое может возникнуть проблема дизайна.
Если вы используете Runtime.exec() из приложения-стартера, это будет нормально. Если у вас есть что-то вроде:
try {
doStuff();
} catch(Throwable t) {
Runtime.exec(...);
}
вы получите больше, чем одна копия вашего программного обеспечения работает, каждый из которых принимает некоторые ресурсы и не давая их обратно. В таком случае вы должны просто очистить потерю потока и начать новый поток (если это возможно).
Просто чтобы быть ясно, стартер приложение на мой взгляд, является то, что с в основном не намного больше, чем:
while(true) {
Process p = Runtime.exec(your COM communication program);
if (p.waitFor() == 0 { // Clean exit
break; // exit while loop.
}
// Otherwise p closed with an error and a new process should be started
// which is done in the next iteration of the loop
}
Когда вы начинаете процессы с Runtime.exec() вы потребляя стандартный вывод и потоки stderr? Если нет, приложение замерзает, когда оно заполняет буфер ОС. В зависимости от того, сколько продукции производит приложение и как часто оно генерирует исключения, ваши номера могут отличаться.
- 1. CreateWindow Freezes
- 2. WriteFIle freezes
- 3. Negamax freezes
- 4. BeautifulSoup freezes
- 5. UIImagePicker freezes
- 6. scypy.signal.decimate() freezes GUI
- 7. Html5 video.currentTime freezes player
- 8. C# application freezes
- 9. R `dev.new()` freezes
- 10. using setTimeout freezes browser
- 11. Xcode 4.3.2 организатор freezes
- 12. Async WebRequest freezes application
- 13. SDL program freezes
- 14. didReceiveRemoteNotification: fetchCompletionHandler: загрузить freezes
- 15. C# Performancecounter freezes ui
- 16. DownloadManager freezes ui
- 17. Функция Azure freezes (?)
- 18. perl debugger freezes
- 19. Prefuse freezes JFrame
- 20. UIWebthreadlock freezes app
- 21. Reactor.run freezes loop
- 22. Delphi DBExpress SQLDataSet.ExecSQL freezes
- 23. zbar IOS screen freezes
- 24. Async Task Freezes UI
- 25. Task.WaitAll freezes app C#
- 26. ECSlidingViewController freezes UIRefreshControl
- 27. BeagleBone Black freezes
- 28. Apache Tomcat WebApp freezes
- 29. Android Junit Testing Freezes
- 30. Bootstrap modal freezes страница
Как часто он слушает порт или считывает данные? –
Значит ли это, что в какой-то момент у вас есть приложение, на котором запущена другая копия вашего приложения, в которой запускается другая копия вашего приложения и т. Д. (В зависимости от количества исключений)? – extraneon
Возможный дубликат http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help-me-diagnose-problems – Raedwald