2010-11-22 134 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緩衝區時會凍結。根據應用程序產生多少輸出以及拋出異常的頻率,您的數字可能會有所不同。