2015-09-03 538 views
2

快速回答當然是「無需哭泣」:)。Java進程如何死亡?

在Win7 32位系統上,我的Java應用程序(J2SE 1.7)出現了一個非常奇怪的問題。我遇到的所有情況:

  • 有時超出Java堆內存(所以我可以登錄並從此一蹶不振)
  • 有時在本地崩潰,我有hs_err_pidxxxx.log文件和我可以分析正在發生的事情。
  • 有時它會崩潰在本機和我沒有hs_err文件,但我有一個彈出的Java停止運作,我可以看到Windows事件日誌中的異常,甚至用視覺的一部分過程進行調試。
  • 有時它會崩潰,我什麼都沒有(沒有hs_err,沒有彈出,沒有...)。它只是結束,如果有System.exit()或本地exit()調用。

所以我的問題是:

  • 我怎麼能肯定這是一個天然的退出調用,因爲我沒有我使用本機庫的所有代碼?
  • 是否有可能產生這種奇怪的行爲產生的另一種意思?
  • 最後如何調試和跟蹤哪些lib可能是根本原因?
+0

這個錯誤是否可重現?也就是說,是否存在一系列條件,當存在時程序總是表現出這種行爲? –

+0

不是100%可複製的,但應用程序中的某個路徑會導致這種「崩潰」。當然這個路徑涉及本地庫。這不是隨時可能發生的隨機錯誤,但是在特定路徑中,它可以「崩潰」或不崩潰。 – TrapII

回答

1

我怎麼能肯定這是一個天然的退出調用,因爲我不知道所有我使用本機庫的 代碼?

我知道確定的唯一方法就是用調用命令將調用包裝到本地庫,以便在每次調用之前和每次返回之後都記錄日誌。如果日誌有輸入消息但沒有返回消息,那麼程序崩潰之後,那個庫調用就會被懷疑。

是否有可能產生另一個 意味着這種奇怪的行爲?

是的,有無數的奇怪的其他手段。 使用內存或其他資源可能是一種解釋。

最後如何調試和跟蹤哪些lib可能是根本原因?

上面描述的日誌記錄應該也會發現這一點,如果消息是特定於哪個庫被調用。你可以在jconsole中監視應用程序,看它是否佔用了大量的內存或線程。禁用任何可以禁用的功能,以便將其作爲問題的一部分予以消除。如果問題消失,則可以在問題恢復之前一次啓用一項。

+0

典型的C /本機錯誤可能遲後會影響很少的電話等。但同意,最好是知道可疑的電話,那不知道。 –

+0

感謝,顯而易見的調試方式。我想我自己並沒有想到這件事,因爲有很多本地調用來包裝,我認爲有一個「通用的方法」來實現這一點。 – TrapII

1

我怎麼能確定這是一個本機出口調用,因爲我沒有我使用的所有本地庫代碼?

調試它。

是否有可能產生這種奇怪的行爲產生的另一種意思?

很難說......可能是線程,可能是內存泄漏,...

最後如何調試和跟蹤哪些lib可以是根本原因?

運行Java與

-XX:+CreateMinidumpOnCrash 

,你會得到一個崩潰轉儲,你可以分析。或者使用

-XX:+UseOSErrorReporting 

來讓Windows處理崩潰(這將顯示例如一個消息,要求安裝調試,這取決於你所安裝的東西。這可能也顯示「發送到Microsoft」錯誤報告)。

+0

感謝您使用我不知道的Java命令行參數。 – TrapII