如何在Java 9中使用线程获取堆栈跟踪?
Java9添加了StackWalker类,以提供用于访问当前线程堆栈的标准API。在以前的Java版本中,我们可以使用Throwable::getStackTrace,Thread::getStackTrace和SecurityManager::GetClassContext提供的方法来获取线程堆栈。
Thread.getStackTrace()方法将返回表示线程堆栈转储的堆栈跟踪元素数组(StackTraceElement[])。数组的第一个元素表示堆栈的顶部,可以是序列中的最后一个方法调用,而数组的最后一个元素表示堆栈的底部,可以是序列中的第一个方法调用。
语法
public StackTraceElement[] getStackTrace()
示例
import java.lang.StackWalker.Option; public class GetStackTraceTest { public static void main(String args[]) { GetStackTraceTest.testPrintCurrnentStackTrace(); GetStackTraceTest.testShowReflectFrames(); } // get StackTrace using Thread public static void testPrintCurrnentStackTrace() { StackTraceElement[] stack = Thread.currentThread().getStackTrace(); for(StackTraceElement element : stack) { System.out.println(element); } } // SHOW_REFLECT_FRAMES public static void print(StackWalker stackWalker) { stackWalker.forEach(stackFrame -> System.out.printf("%6d| %s -> %s %n", stackFrame.getLineNumber(), stackFrame.getClassName(), stackFrame.getMethodName())); } public static void testShowReflectFrames() { final StackWalker stackWalker = StackWalker.getInstance(Option.SHOW_REFLECT_FRAMES); print(stackWalker); } }
输出结果
java.base/java.lang.Thread.getStackTrace(Thread.java:1654) GetStackTraceTest.testPrintCurrnentStackTrace(GetStackTraceTest.java:10) GetStackTraceTest.main(GetStackTraceTest.java:5) 17| GetStackTraceTest -> print 25| GetStackTraceTest -> testShowReflectFrames 6| GetStackTraceTest -> main