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