2010-11-22 113 views
0

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

+0

它多频繁地监听端口或读取数据? – 2010-11-22 10:15:50

+1

这是否意味着在某些时候,您的应用程序正在运行另一个应用程序副本,该应用程序会运行另一个应用程序副本等等(取决于例外情况)? – extraneon 2010-11-22 10:16:12

+0

可能的重复http://stackoverflow.com/questions/25385173/what-is-a-debugger-and-how-can-it-help-me-diagnose-problems – Raedwald 2016-01-29 03:37:39

回答

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流?如果否,则应用程序在填充OS缓冲区时会冻结。根据应用程序产生多少输出以及抛出异常的频率,您的数字可能会有所不同。