2015-05-17 78 views
3

我有代碼生成基於ThreadMXBean的線程轉儲,但它只是線程狀態以及他們的堆棧跟蹤,有沒有辦法獲得由kill -SIGQUIT生成的Java全線程轉儲的其他部分?以編程方式完全線程轉儲(GC線程,JNI等...)

我正在對以下其他部分的位置: -

GC線程

"GC task thread#0 (ParallelGC)" prio=3 tid=0x0000000100120000 nid=0x3 runnable 
"GC task thread#1 (ParallelGC)" prio=3 tid=0x0000000100131000 nid=0x4 runnable 

VM線程

"VM Periodic Task Thread" prio=3 tid=0x00000001nid=0x19 waiting on condition 

JNI全局引用計數

JNI global references: 1925 

的Java堆uti補腎中藥視圖

1 Heap 
2 PSYoungGen  total 466944K, used 178734K [0xffffffff45c00000, 0xffffffff70800000, 0xffffffff70800000) 
3 eden space 233472K, 76% used [0xffffffff45c00000,0xffffffff50ab7c50,0xffffffff54000000) 
4 from space 233472K, 0% used [0xffffffff62400000,0xffffffff62400000,0xffffffff70800000) 
5 to space 233472K, 0% used [0xffffffff54000000,0xffffffff54000000,0xffffffff62400000) 
6 PSOldGen  total 1400832K, used 1400831K [0xfffffffef0400000, 0xffffffff45c00000, 0xffffffff45c00000) 
7 object space 1400832K, 99% used [0xfffffffef0400000,0xffffffff45bfffb8,0xffffffff45c00000) 
8 PSPermGen  total 262144K, used 248475K [0xfffffffed0400000, 0xfffffffee0400000, 0xfffffffef0400000) 
9 object space 262144K, 94% used [0xfffffffed0400000,0xfffffffedf6a6f08,0xfffffffee0400000) 

到目前爲止我的代碼:通過擊殺產生

public static String threadDump() { 
    String s = ""; 
    ThreadMXBean bean = ManagementFactory.getThreadMXBean(); 
    ThreadInfo[] theadDumps = bean.dumpAllThreads(true, true); 
    s += "Number threads: " + theadDumps.length + "\n"; 

    s += "========= Threads ===========\n"; 
    for (ThreadInfo threadInfo : theadDumps) { 
     String t = threadInfo.toString(); 
     t = t.substring(0, t.indexOf("\n")); 
     s += t + "\n"; 
     for (StackTraceElement stackTraceElement : threadInfo.getStackTrace()) { 
      s += " " + stackTraceElement + "\n"; 
     } 
     s += "======\n"; 
    } 
    return s; 
} 
+0

其中一些統計信息不是線程相關的,您必須從多個來源組裝它們,而不僅僅是線程bean。 – the8472

回答

0

線程轉儲-3爲您提供了「應用」和「虛擬機」的線程轉儲。您引用的'vm'線程和GC統計信息不是ThreadMXBean的一部分。 您可以使用GarbageCollectorMXBean獲取GC統計信息所需的數據。 我遇到的VM線程的唯一用途是確定我們是否內存不足(即繁忙的GC線程)。但是你仍然可以用你從GarbageCollectorMXBean得到的數據做到這一點。我還沒有遇到'JNI全局引用'的需要,主要是因爲我沒有任何直接使用JNI的東西。