2012-05-23 38 views
2

問題場景:在sonic MF容器(jvm)中注意到問題。容器託管了一些負責數據庫操作和消息轉換的java服務。一旦啓動,容器運行良好持續2-3周,並自行終止而不會拋出任何例外。如何在JVM自動終止時生成線程轉儲

經過大量研究,我們無法找出觸發jvm(MF Container)關閉的原因或原因。

當jvm自動關閉時,我可以通過哪種方式獲得線程轉儲?我使用的是Java 1.6。有沒有其他方法可以解決這個問題?

在此先感謝。

回答

3

你可以嘗試java.lang.Runtime.addShutdownHook(),並讓鉤子迭代所有線程並將其堆棧跟蹤轉儲爲Thread.getAllStackTraces()。但是,如果JVM被關閉了Runtime.halt()那麼鉤子將不會被調用。更復雜的是,使用instrumentation掛接到Runtime.exit()Runtime.halt()(或Shutdown.sequence(),請參閱編輯#2)的調用,以便您可以在調用任何時間時看到發生了什麼。

編輯:這樣做會安裝一個SecurityManager不執行任何安全性的另一種方式,但它轉儲線程列表時SecurityManager.checkExit(),因爲這兩個halt()exit()調用安全管理方法。這將比使用檢測更容易,除了記錄線程正在做什麼之外,您甚至可以決定拋出異常。

編輯2:運行JVM的系統可以告訴JVM終止,在這種情況下使用安全管理器將不起作用。由於被調用的方法是java.lang.Shutdown.exit(),所以也不會在Runtime.exit()Runtime.halt()上使用儀器。如果JVM由於最後的守護進程線程完成而關閉,則調用Shutdown.shutdown()。但關機掛鉤在任何一種情況下工作。因此,即使您也要使用安全管理器或儀器,您應始終使用關閉掛鉤。

+0

'有鉤子遍歷所有線程並轉儲他們的堆棧跟蹤'他應該怎麼做? – Cratylus

+0

使用java.lang.Thread.getAllStackTraces()。我會將其添加到我的答案中。 –