2010-03-16 56 views
4

我正在創建一個全局異常處理,它在某些情況下關閉之前收集一些信息。其中一個信息是當前的線程轉儲。我用下面的代碼做這個:如何編寫可分析的線程轉儲格式

ManagementFactory.getThreadMXBean().dumpAllThreads(true, true); 

問題是將信息寫入TDA的可分析格式。有沒有一種「簡單」的方式來格式化信息,而不是自己寫格式?

編輯:我想有一個完整的線程轉儲,所以我可以找到有問題的線程。上面提到的方法提供了一個ThreadInfo對象的數組,所以我有這些數據。我的問題是寫入的輸出不是TDA認定爲線程轉儲的格式。

+0

想要什麼樣的格式? ThreadMXBean提供了什麼? – Riduidel 2010-03-16 09:27:15

+1

你說的這個TDA是什麼? – 2010-03-17 21:03:45

+0

我認爲這是對的? https://tda.dev.java.net/ – 2010-03-17 21:06:34

回答

0

如果你在windows上,然後bwithers有described一種方式來通知JVM線程轉儲。

還有一個pure java approach,但我不確定輸出是否爲標準格式。

3

如果你不想複製TDA代碼(這是LGPL,畢竟),你也可以使用安裝API來獲取數據採用標準格式。據我所知,執行轉儲的唯一JVM內置代碼是Attach代理中的本地代碼。

String selfName = ManagementFactory.getRuntimeMXBean().getName(); 
final int selfPid = Integer.valueOf(selfName.substring(0, selfName.indexOf('@')));     

HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine.attach(Integer.toString(selfPid)); 

InputStream sDump = vm.remoteDataDump(new Object[]{"-l"}); // lowercase L for lock dump 

數據轉儲將返回字符數據流中的轉儲。

+0

不錯的一個。需要在Eclipse中刪除訪問限制來解決com.sun類。 – 2013-02-18 10:13:55

+0

只需添加... HotSpotVirtualMachine.class僅適用於1.6或更高版本,在JDK的tools.jar內 – pavan 2013-04-30 23:04:43