java虚拟机中获取线程堆栈的信息,可以通过jstck命令:
/**
* 通过java代码 使用jstack查看线程堆栈信息
* created by jintian chen
* 2018/04/21
*/
@Slf4j
public abstract class JstackUtil {
/**
* 获取线程快照信息
*
* @return
*/
public static String getJavaStackTrace() {
StringBuffer msg = new StringBuffer();
for (Map.Entry<Thread, StackTraceElement[]> stackTrace : Thread.getAllStackTraces().entrySet()) {
Thread thread = (Thread) stackTrace.getKey();
StackTraceElement[] stack = (StackTraceElement[]) stackTrace.getValue();
if (thread.equals(Thread.currentThread())) {
continue;
}
msg.append("\n 线程:").append(thread.getName()).append("\n");
for (StackTraceElement element : stack) {
msg.append("\t").append(element).append("\n");
}
}
return msg.toString();
}
public static void main(String[] args) {
String msg = JstackUtil.getJavaStackTrace();
log.info(msg);
}
}
效果如下:
2018-04-22 23:08:34.285 INFO (JstackUtil.java:38) -
线程:Signal Dispatcher
线程:Finalizer
java.lang.Object.wait(Native Method)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)
线程:Reference Handler
java.lang.Object.wait(Native Method)
java.lang.Object.wait(Object.java:502)
java.lang.ref.Reference.tryHandlePending(Reference.java:191)
java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)
Disconnected from the target VM, address: '127.0.0.1:52108', transport: 'socket'
Process finished with exit code 0