如何对GraalVM Native应用执行线程(堆栈)转储?
GraalVM Native 应用线程转储实现方法
要在GraalVM原生应用中获取类似jstack的线程转储,核心是先在构建原生镜像时启用线程转储支持,再通过信号或工具触发:
1. 构建时启用线程转储支持
构建原生镜像时必须添加--enable-monitoring=threaddump参数,确保生成的可执行文件具备线程转储能力:
native-image --enable-monitoring=threaddump com.yourpackage.MainClass
2. 触发线程转储的几种方式
方式一:通过信号触发(Linux/macOS)
- 先找到应用进程PID:
ps aux | grep <your-app-executable-name> - 发送
SIGQUIT信号,线程转储会直接输出到应用的标准输出:kill -QUIT <pid>
方式二:通过信号触发(Windows)
- 找到应用PID:可通过任务管理器或
tasklist命令查询 - 发送
SIGQUIT信号:
若应用在控制台运行,直接按taskkill /PID <pid> /SIGQUITCtrl+Break组合键也能触发。
方式三:使用jcmd工具
如果你的环境中安装了GraalVM的jcmd,可以直接连接进程输出线程转储:
jcmd <pid> Thread.print
方式四:代码内主动触发
在应用代码中调用Java标准API主动获取线程堆栈,适用于需要程序化获取的场景:
import java.util.Map; public class ThreadDumpUtil { public static void printThreadDump() { Map<Thread, StackTraceElement[]> stackTraces = Thread.getAllStackTraces(); for (Map.Entry<Thread, StackTraceElement[]> entry : stackTraces.entrySet()) { Thread thread = entry.getKey(); System.out.printf("Thread: %s (ID: %d, State: %s)%n", thread.getName(), thread.getId(), thread.getState()); for (StackTraceElement element : entry.getValue()) { System.out.printf("\tat %s%n", element); } System.out.println(); } } }
内容的提问来源于stack exchange,提问作者Artem Novikov
相关产品推荐
相关产品推荐

