2010-01-07 138 views
1

我一直在使用J2EE和Derby數據庫開發Java應用程序。我的老闆完成了大部分的測試,而且我完成了大部分的編碼工作,但他遇到了一個奇怪的問題。他聲稱偶爾Java應用程序「崩潰他的電腦」。Java崩潰Windows

要提及一些細節,首先讓我說我目前正在遠程工作,所以當這些「崩潰」發生時我無法在身邊。其次,我使用OS X 10.6,他使用Windows XP(我相信SP3)。有問題的Java應用程序不使用任何JNI或任何奇怪的東西,除了嵌入式Derby數據庫。最後,他說它凍結了Windows中的所有內容(他的鼠標甚至沒有移動) - 它不會像未捕獲的異常一樣顯示在控制檯中。

那麼,有可能我的Java程序崩潰了他的電腦?我不認爲Java代碼可能會在JVM之外產生任何系統級的影響。這是否可能是我的程序的錯誤,或者我應該忽略它並將其歸因於他的計算機出現問題?

+0

J2EE是一個相當廣泛的(和舊的)術語。你是否想要說一個Java(JSP/Servlet)Web應用程序?如果是這樣,那麼測試結果如何?用網頁瀏覽器?如果是這樣,哪一個?是否還有一些JavaScript涉及?如果是這樣,我也會注意到這一點。 – BalusC 2010-01-07 22:10:00

+1

它的J2EE只是在我使用javax.persistence,其他所有東西都是swing – twolfe18 2010-01-08 00:23:55

回答

3

對於Java應用程序崩潰運行的操作系統,JVM中必須存在一個錯誤。這表示有,可以給同樣的印象情況:

  • Java應用程序的操作系統啓動交換和其他應用程序出現減速至停止
  • 的Java應用程序可以增加它的堆遠遠不夠抓住所有CPU由一個或多個線程在緊張繁忙的循環

如果你可以設置測試人員的機器,使堆轉儲可能出現問題時被觸發,你可以分析遠程傾倒。例如在alphaworks上找到IBM的Java heap analyzer

+0

的意義上說,或者操作系統可能會單獨變得不穩定,Java只是簡單地挑剔一些額外的硬件,否則就是在做完全正確的事情。 – PSpeed 2010-01-07 22:26:31

+1

或者操作系統可能是完全穩定的,@ rsp的迴應是完全準確的。 – 2010-01-07 23:06:16

+0

我並不反對他的選擇......只是增加一個。根據我個人的經驗,Java很多時候都是通過藍屏來屏蔽Windows的,這是因爲Windows安裝或硬件錯誤。我的Java藍屏有一個內存不好的盒子,我的Java藍屏有一個盒子,裏面有可惡的網絡驅動,壞的顯卡驅動等等。 – PSpeed 2010-01-08 18:56:41

2

由於圖形驅動程序不正確,在IBM Thinkpads(以及其他機器上)的Windows下發生崩潰之前就有過這種情況。我建議通常的做法是確保司機是最新的,以確保安全。

雖然你的代碼可能不直接使用JNI,但很多底層可能發生的事情(基本上與底層操作系統集成的任何東西)。這意味着司機可能是一個大問題。另一件事就是確保使用最新版本的Java(如果1.6_17最終不能使用Java版本的最新版本)。

對我來說固定隨機崩潰的另一件事是重新安置內存(拔下插頭並重新插入)。

+0

它有趣,你提到thinkpad,這就是他正在運行。我認爲你可能是對的,這是一個驅動程序問題,但說實話,我只是想知道我的程序是否可以做到這一點(聽起來像不是)。 – twolfe18 2010-01-08 00:25:56

+0

不好直接。 thinkpad問題最終是directx問題,其中directx被Java大量使用,其中沒有其他應用程序大量使用它,因此暴露了驅動程序中的潛在錯誤。 – TofuBeer 2010-01-08 00:53:36

2

他說,這在Windows凍結一切(他的鼠標不連招)

用戶模式應用 - 無論是Java或以其他方式 - 不能這樣做,對一個現代操作系統像WINNT 。

他要麼有硬件問題,要麼是壞的驅動程序。

0

還檢查客戶端(Windows/XP)系統上的頁面文件空間。

0

第一點:在我的XP,SP3系統上,當任何程序運行完全傾斜時,它幾乎鎖定了計算機。當我的防病毒程序檢查更新時,其他任何事情都會停止以實現所有目的,並且它使用的CPU很少(似乎一直在寫入磁盤)。我自己的無限循環,使用100%的CPU,也有類似的效果。 (爲什麼任務管理器不超過「標準」優先級的用戶程序,我不知道獲得優先權。)

點二:在任何計算機上我曾經使用過,重分頁會帶來一個程序的幾乎完全停止。

因此,從具有512Mb真實內存和2000Mb虛擬內存的XP計算機開始。用1400Mb的數組和其他數據結構編寫一個Java程序。放入一個重複數十億次的循環,並在每次執行時讀取或寫入1400Mb中的每個字節。直到宇宙崩潰之後,這個計劃纔會結束。電腦什麼都不做。我沒有嘗試過這一點,我也不打算這樣做,但我敢打賭,即使鼠標不動,我也會下注。根據電腦的不同,唯一的修復方法可能是將電源插頭從電源插座拔出。 (注意,從技術上講,電腦並沒有崩潰,事實上,它工作得很好,但你需要耐心等待,在你打算點擊前一天移動鼠標。)

這個故事的寓意是爲了避免XP和虛擬內存,但如果你必須處理這兩個問題,請注意這些問題。

1

崩潰整個計算機,試試這個:

public void crashComputer() { 
    while(true) 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       while(true) { 
        crashComputer(); 
       } 
      } 
     }).start(); 
} 

public void crashJVM() { 
    while(true) 
     crashJVM(); 
} 

的crashComputer功能大約需要2秒崩潰整個計算機。您可以通過按住電源按鈕來防止它崩潰。

crashJVM函數通過重載堆棧導致堆棧溢出(這是本網站名稱的來源),從而導致JVM崩潰。

警告:使用需要您自擔風險。這不會損害您的電腦,但如果您忘記點擊保存文檔或其他內容,我不會承擔責任。