Java程序冻结

Java程序冻结,java,freeze,Java,Freeze,我编写了一个java程序,它在自己的线程中从com端口读取数据,并将其放入数据库中。当出现异常(数据库或com)时,它会使用runtime.exec重新启动自身。大约一天后,程序有时会冻结。我无法准确地记录这种情况何时发生,但它似乎是在一段时间后发生的。 你们当中有人知道问题出在哪里吗? 谢谢! 如果您只是捕获IO异常,然后执行runtime.exec,可能会因为太多JVM而导致内存不足。。。您确定在执行新的runtime.exec时旧程序(和JVM)已经完全消失了吗?也就是说,正如@extra

我编写了一个java程序,它在自己的线程中从com端口读取数据,并将其放入数据库中。当出现异常(数据库或com)时,它会使用runtime.exec重新启动自身。大约一天后,程序有时会冻结。我无法准确地记录这种情况何时发生,但它似乎是在一段时间后发生的。 你们当中有人知道问题出在哪里吗?
谢谢!

如果您只是捕获IO异常,然后执行runtime.exec,可能会因为太多JVM而导致内存不足。。。您确定在执行新的runtime.exec时旧程序(和JVM)已经完全消失了吗?也就是说,正如@extraneon所说,你确定你的程序没有创建你的程序的另一个实例,而这又会创建你的程序的另一个实例

根据软件的实现方式,您可能会遇到设计问题

如果您从启动程序应用程序中使用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()启动进程时,是否正在使用stdout和stderr流?如果否,应用程序将在填充操作系统缓冲区时冻结。根据应用程序产生的输出量和抛出异常的频率,您的数字可能会有所不同。

它侦听端口或读取数据的频率有多高?这是否意味着您的应用程序在某个时候运行另一个应用程序副本,而该应用程序又运行另一个应用程序副本,依此类推(取决于异常的数量)?可能的副本