2009-10-31 57 views
0

我正在研究一個擁有多個視圖的eclipse應用程序。從這些觀點來看,我必須通過電線訪問一些數據。在以下情況下會引發錯誤。如果網絡被修改,Java應用程序掛起

第1步:啓動應用程序,一切工作正常。
步驟2:禁用網絡
步驟3:啓用網絡
步驟4:嘗試通過有線視圖從其中一個視圖訪問數據。該應用顯然掛起。
第5步:現在如果您嘗試從其他視圖訪問數據,則一切正常。

最初我以爲這是由於JVM的DNS緩存而發生的。所以我做了這樣的事情。

System.setProperty("networkaddress.cache.ttl", "0"); 
System.setProperty("networkaddress.cache.negative.ttl" , "0"); 

但問題仍然存在。任何幫助表示讚賞。

+0

還有1件事。在步驟2和步驟3之間,當網絡關閉時,雖然無法訪問數據,但應用程序不會掛起。 – Duleb 2009-10-31 09:11:38

回答

1

完全荒野猜測:如果您使用TCP,您的應用程序可能不會注意到它的套接字已斷開連接。如果它在讀取中被阻塞,它可能不會注意到它試圖向套接字寫入內容。這取決於套接字關閉的「乾淨」程度 - 如果套接字沒有從另一端獲得RST數據包,它不會知道另一端已經消失。

您可以嘗試強制從應用程序中取出線程轉儲。通常,JVM在運行時會響應Ctrl- \,或者在每個線程的堆棧跟蹤中響應kill -QUIT信號。這可以讓你看到問題線程被阻塞的位置。

如果您可以發佈一些可疑代碼,那麼嘗試進行診斷會容易得多。或者你能解釋爲什麼你認爲DNS緩存會成爲一個問題嗎?

0

它可能在第2步和第3步之間。拋出了什麼類型的異常?

+1

沒有例外..沒什麼。它只是掛起。 – Duleb 2009-10-31 11:09:00

0

另一種選擇時看到您的應用程序掛是使用JPS/jstack當前堆棧(捆綁與Sun的JDK 1.5開始)或VisualVM的(1.6軟件開發工具包提供,並分別從https://visualvm.dev.java.net/

太平紳士名單一臺機器上所有當前的java進程。然後你可以使用這些進程id中的每一個來調用jstack來獲取當前的堆棧。

也許如果你可以發佈這樣的堆棧跟蹤,我們可以提供幫助。