Java程序冻结

时间:2010-11-22 10:11:33

标签: java freeze

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

4 个答案:

答案 0 :(得分:1)

如果您只是捕获IO异常,并执行runtime.exec,由于JVM太多,您可能会内存不足...在执行新运行时,您是否确定旧程序(和JVM)已完全消失.exec?也就是说,正如@extraneon所说,你确定你的程序没有创建程序的另一个实例,而这反过来又会创建程序的另一个实例,......?

答案 1 :(得分:0)

答案 2 :(得分: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
}

答案 3 :(得分:0)

使用Runtime.exec()启动进程时是否正在使用stdout和stderr流?如果不是,则应用程序在填充OS缓冲区时将冻结。根据应用程序产生的输出量以及抛出异常的频率,您的数字可能会有所不同。