問題場景:在sonic MF容器(jvm)中注意到問題。容器託管了一些負責數據庫操作和消息轉換的java服務。一旦啓動,容器運行良好持續2-3周,並自行終止而不會拋出任何例外。如何在JVM自動終止時生成線程轉儲
經過大量研究,我們無法找出觸發jvm(MF Container)關閉的原因或原因。
當jvm自動關閉時,我可以通過哪種方式獲得線程轉儲?我使用的是Java 1.6。有沒有其他方法可以解決這個問題?
在此先感謝。
問題場景:在sonic MF容器(jvm)中注意到問題。容器託管了一些負責數據庫操作和消息轉換的java服務。一旦啓動,容器運行良好持續2-3周,並自行終止而不會拋出任何例外。如何在JVM自動終止時生成線程轉儲
經過大量研究,我們無法找出觸發jvm(MF Container)關閉的原因或原因。
當jvm自動關閉時,我可以通過哪種方式獲得線程轉儲?我使用的是Java 1.6。有沒有其他方法可以解決這個問題?
在此先感謝。
你可以嘗試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()
。但關機掛鉤將在任何一種情況下工作。因此,即使您也要使用安全管理器或儀器,您應始終使用關閉掛鉤。
參見https://docs.oracle.com/javase/7/docs/webnotes/tsg/TSG-VM/html/hangloop.html「故障排除懸掛或循環過程」
然而,至少在我的情況下,Eclipse是掛,並且不以任何的這些做出響應。
'有鉤子遍歷所有線程並轉儲他們的堆棧跟蹤'他應該怎麼做? – Cratylus
使用java.lang.Thread.getAllStackTraces()。我會將其添加到我的答案中。 –