2010-11-22 3 views
0

Я написал программу java, которая считывает данные из COM-порта в своем потоке и помещает его в базу данных. Когда происходят исключения (база данных или com), он перезапускает себя с помощью runtime.exec. Через день или около того программа иногда замерзает. Я не могу отслеживать, когда это происходит точно, но похоже, что это произойдет через некоторое время. Кто-нибудь из вас знает, что может быть проблемой? Спасибо!Java-программа Freezes

+0

Как часто он слушает порт или считывает данные? –

+1

Значит ли это, что в какой-то момент у вас есть приложение, на котором запущена другая копия вашего приложения, в которой запускается другая копия вашего приложения и т. Д. (В зависимости от количества исключений)? – extraneon

+0

Возможный дубликат http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help-me-diagnose-problems – Raedwald

ответ

1

Если вы просто поймаете исключения IO и выполните runtime.exec, вы можете избавиться от памяти из-за слишком большого количества JVM ... Вы уверены, что старая программа (и JVM) полностью исчезла при выполнении нового Runtime.exec? То есть, как сказал @extraneon, вы уверены, что ваша программа не создает другой экземпляр вашей программы, который, в свою очередь, создает еще один экземпляр вашей программы ...?

0

В зависимости от того, как вы реализуете ваше программное обеспечение, которое может возникнуть проблема дизайна.

Если вы используете 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 
} 
0

Когда вы начинаете процессы с Runtime.exec() вы потребляя стандартный вывод и потоки stderr? Если нет, приложение замерзает, когда оно заполняет буфер ОС. В зависимости от того, сколько продукции производит приложение и как часто оно генерирует исключения, ваши номера могут отличаться.