You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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> /SIGQUIT
    
    若应用在控制台运行,直接按Ctrl+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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:22:14