如何在运行中的JVM上查看Virtual Threads(虚拟线程)?
虚拟线程监控与调试工具建议
1. JDK自带命令行工具
- jcmd:JDK 21及以上版本新增了虚拟线程专属命令,无需额外安装工具:
- 执行
jcmd <进程ID> VirtualThread.list可列出所有虚拟线程的ID、名称、状态(RUNNABLE/BLOCKED等)及关联的载体线程; - 执行
jcmd <进程ID> Thread.print -v会输出所有线程(含虚拟线程)的完整栈跟踪,虚拟线程会标注VirtualThread标识; - 导出线程信息到文件可使用
jcmd <进程ID> Thread.dump_to_file -format=json <输出文件路径>,JSON格式会清晰区分虚拟线程与平台线程。
- 执行
- jstack:JDK 21+版本的
jstack默认包含虚拟线程栈信息,直接执行jstack <进程ID>即可查看,虚拟线程栈顶部会标注VirtualThread字样。
2. JDK Mission Control (JMC)
开源的性能分析工具,最新版本完全支持虚拟线程监控:
- 可实时查看虚拟线程总数、状态分布(运行/阻塞/等待);
- 能追踪虚拟线程生命周期,查看阻塞具体原因(如锁等待、IO阻塞);
- 提供火焰图、线程快照等功能,方便定位性能瓶颈。
3. IDE调试工具
- IntelliJ IDEA 2023.1+:调试会话中,调试窗口会单独显示「Virtual Threads」标签,可查看所有活跃虚拟线程的栈帧、状态,支持给虚拟线程设断点,还能单独冻结/解冻目标虚拟线程,适配开发阶段调试需求。
- Eclipse 2023-03+:同样支持在调试视图中展示虚拟线程,配合JDK 21+调试API,可直接对虚拟线程进行调试操作。
4. VisualVM 最新版
你之前使用的VisualVM在2.1.6及以上版本已支持虚拟线程:
- 线程面板会自动区分平台线程与虚拟线程,可切换查看;
- 能查看虚拟线程的栈信息、状态,以及它们关联的载体线程池情况;
- 支持生成线程快照,对比不同时段的虚拟线程状态变化。
代码层面的辅助调试
若需在代码中临时排查,可利用JDK提供的API:
- 使用
VirtualThread.current()(JDK21+)获取当前虚拟线程实例,调用getState()查看状态; - 通过
Thread.getAllStackTraces()获取所有线程(含虚拟线程)的栈跟踪,过滤VirtualThread类型条目即可分析; - 自定义虚拟线程工厂时,给每个虚拟线程设置明确名称(如
Thread.ofVirtual().name("conn-%d", Thread.NAME_PATTERN_SEQUENTIAL).factory()),方便在工具中快速识别不同连接对应的虚拟线程。
内容的提问来源于stack exchange,提问作者chesterbr
相关产品推荐
相关产品推荐

