完全线程转储(GC线程,JNI等...)以编程方式

时间:2015-05-17 10:03:44

标签: java garbage-collection

我有基于ThreadMXBean生成线程转储的代码,但它只是线程统计信息及其堆栈跟踪,是否有办法获取Java完整线程转储的其他部分kill -SIGQUIT

我在这里采取以下其他部分: -

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=0x0000000101238800 nid=0x19 waiting on condition

JNI全球参考计数

JNI global references: 1925

Java堆利用率视图

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;
}

1 个答案:

答案 0 :(得分:0)

kill -3生成的线程转储为您提供了一个' application'和' vm'线程。 ' vm'您引用的线程和GC统计信息不是ThreadMXBean的一部分。 您可以使用GarbageCollectorMXBean获取GC统计信息所需的数据。 我遇到的VM线程的唯一用途是确定我们是否内存不足(即繁忙的GC线程)。但是你仍然可以使用从GarbageCollectorMXBean获得的数据来执行此操作。我没有看到JNI全球参考资料的需要,主要是因为我没有直接使用JNI的任何内容。