Java программа зависает - PullRequest
       1

Java программа зависает

0 голосов
/ 22 ноября 2010

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

Ответы [ 4 ]

1 голос
/ 22 ноября 2010

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

0 голосов
/ 22 ноября 2010

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

0 голосов
/ 22 ноября 2010

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

Если вы используете 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 голосов
/ 22 ноября 2010
...