我正在研究編寫在Java應用程序內部運行的監視代碼,並定期拍攝正在運行的線程的快照,並在每個線程上顯示一些調用堆棧信息。您可以暫停Java應用程序並從應用程序中獲取它的線程快照嗎?
理想情況下,這將擴展用於分析和/或監測。
我不想使用外部工具,因爲這是用於自我教育的目的。
我正在研究編寫在Java應用程序內部運行的監視代碼,並定期拍攝正在運行的線程的快照,並在每個線程上顯示一些調用堆棧信息。您可以暫停Java應用程序並從應用程序中獲取它的線程快照嗎?
理想情況下,這將擴展用於分析和/或監測。
我不想使用外部工具,因爲這是用於自我教育的目的。
您是否查看過Thread類的方法,如Thread.enumerate()
,Thread.activeCount()
,Thread.getName()
?
看看ThreadMXBean.dumpAllThreads(boolean, boolean)
ThreadMXBean bean = ManagementFactory.getThreadMXBean();
ThreadInfo[] info = bean.dumpAllThreads(true, true);
你可以註冊你想在創建時看線程,有一個單獨的指標線程來完成監測。您可能想要在線程中創建某些指標,例如最近運行時間列表,當前吞吐量或其他類型的指標。
殺-SIGQUIT {} java_process
將轉儲堆棧跟蹤在java程序的標準輸出。
我不相信有一種方法可以停止所有線程(來自Java字節碼內)。如果你使用JNI啓動JVM,那麼_might_是一種方法。 – Justin 2010-06-04 18:31:07
非常感謝我的目的 – justinhj 2010-06-04 19:02:20