Arthas dashboard 命令详解:实时监控 JVM 线程、内存、GC 与 Tomcat 状态
2026/9/19 4:00:14 网站建设 项目流程

Arthas dashboard 命令详解:实时监控 JVM 线程、内存、GC 与 Tomcat 状态

【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas

dashboard 是 Arthas(Alibaba Java Diagnostic Tool)中最直观的实时监控命令,它以定时刷新的控制台面板形式,一屏呈现目标 JVM 的线程 CPU 占用、内存分区使用、GC 统计与运行时环境信息。本文以site/docs/en/doc/dashboard.md为核心骨架,结合 core 模块源码 逐层拆解其输出含义、参数用法与底层实现原理,帮助你快速定位线程热点、内存压力和 GC 异常。

Arthas dashboard 命令实时面板

dashboard 命令是什么

dashboard 是当前 JVM 的实时统计面板,进入该面板后会按固定时间间隔持续刷新输出,直到你按下Ctrl+C(或输入q)退出。它面向的典型场景包括:

  • 快速查看哪些线程正在消耗 CPU,定位高负载线程;
  • 观察heap / metaspace / code cache 等内存区域的使用率,初步判断是否存在内存压力;
  • 查看GC 次数与 GC 耗时,判断收集器行为是否异常;
  • 当运行在 Apache Tomcat(阿里巴巴定制版)上时,还能额外展示QPS、RT、错误数、线程池等 Tomcat 实时统计。

thread命令的单次快照不同,dashboard 通过持续采样两次采样点之间的 CPU 增量,给出“实时 CPU 占比”这一动态指标,更适合做一段时间的连续观察。

命令选项与参数

dashboard 仅支持两个参数,均在 DashboardCommand.java 中通过注解声明:

名称说明
[i:]两次执行(刷新)之间的时间间隔,单位为毫秒,默认 5000 ms
[n:]该命令总共执行的次数。

对应源码中的默认值定义(DashboardCommand.java):

private int numOfExecutions = Integer.MAX_VALUE; // -n 不指定时无限执行,直到 Ctrl+C private long interval = 5000; // -i 不指定时每 5 秒刷新一次

常用用法:

$ dashboard # 每 5 秒刷新一次,持续显示,Ctrl+C 退出 $ dashboard -n 10 # 只执行 10 次后自动结束 $ dashboard -i 2000 # 每 2 秒刷新一次

命令自带的使用说明(@Description部分)同样给出了这三个示例,可直接在 Arthas 中执行help dashboard查看。注意-n执行完指定次数后进程会自动结束并提示Process ends after N time(s).,无需手动中断(见 DashboardTimerTask.run())。

基本使用与输出全解析

执行dashboard后,面板默认分为四个区域:线程列表(上半部分)MemoryGC(下半部分左半区)以及Runtime / Tomcat(下半部分右半区)。典型的输出如下:

$ dashboard ID NAME GROUP PRIORITY STATE %CPU DELTA_TIME TIME INTERRUPTE DAEMON -1 C2 CompilerThread0 - -1 - 1.55 0.077 0:8.684 false true 53 Timer-for-arthas-dashboard-07b system 5 RUNNABLE 0.08 0.004 0:0.004 false true 22 scheduling-1 main 5 TIMED_WAI 0.06 0.003 0:0.287 false false -1 C1 CompilerThread0 - -1 - 0.06 0.003 0:2.171 false true -1 VM Periodic Task Thread - -1 - 0.03 0.001 0:0.092 false true 49 arthas-NettyHttpTelnetBootstra system 5 RUNNABLE 0.02 0.001 0:0.156 false true 16 Catalina-utility-1 main 1 TIMED_WAI 0.0 0.000 0:0.029 false false -1 G1 Young RemSet Sampling - -1 - 0.0 0.000 0:0.019 false true 17 Catalina-utility-2 main 1 WAITING 0.0 0.000 0:0.025 false false 34 http-nio-8080-ClientPoller main 5 RUNNABLE 0.0 0.000 0:0.016 false true 23 http-nio-8080-BlockPoller main 5 RUNNABLE 0.0 0.000 0:0.011 false true -1 VM Thread - -1 - 0.0 0.000 0:0.032 false true -1 Service Thread - -1 - 0.0 0.000 0:0.006 false true -1 GC Thread#5 - -1 - 0.0 0.000 0:0.043 false true Memory used total max usage GC heap 36M 70M 4096M 0.90% gc.g1_young_generation.count 12 g1_eden_space 6M 18M -1 33.33% 86 g1_old_gen 30M 50M 4096M 0.74% gc.g1_old_generation.count 0 g1_survivor_space 491K 2048K -1 24.01% gc.g1_old_generation.time(ms) 0 nonheap 66M 69M -1 96.56% codeheap_'non-nmethods' 1M 2M 5M 22.39% metaspace 46M 47M -1 98.01% Runtime os.name Mac OS X os.version 10.15.4 java.version 15 java.home /Library/Java/JavaVirtualMachines/jdk-15.jdk/Contents/Home systemload.average 10.68 processors 8 uptime 272s

Memory 区字段

字段含义
used该内存区域当前已使用量
total当前已分配(committed)给 JVM 的量
max最大可用的量(-1表示该区域没有上限,如 eden、survivor、metaspace)
usageused / max 的使用率百分比

Memory 数据来源于 MemoryCommand.memoryInfo() 的复用,可对照memory命令查看更完整的区域列表。GC 统计则来自 JVM 的GarbageCollectorMXBean(见 addGcInfo()),格式为gc.<收集器名>.count(次数)与gc.<收集器名>.time(ms)(累计耗时),例如 G1 收集器下的gc.g1_young_generation.count

Runtime 区字段

字段含义
os.name/os.version操作系统名称与版本
java.version/java.homeJDK 版本与安装路径
systemload.average系统最近 1 分钟平均负载
processorsJVM 可用的处理器核心数
uptimeJVM 已运行秒数

这些值来自 addRuntimeInfo():操作系统属性取自System.getProperty,负载与 uptime 取自OperatingSystemMXBean/RuntimeMXBean,处理器数来自Runtime.getRuntime().availableProcessors()

线程列表列头含义

  • ID:JVM 线程 ID。请注意它与jstack中的nativeID不是同一个值。
  • NAME:线程名称。
  • GROUP:线程组名称。
  • PRIORITY:线程优先级,取值范围 1~10,数值越大优先级越高。
  • STATE:线程状态(RUNNABLE、TIMED_WAITING、WAITING、BLOCKED 等)。
  • CPU%:线程的 CPU 占用率。例如采样间隔为 1000ms,某线程在间隔内 CPU 增量时间为 100ms,则占用率 = 100 / 1000 = 10%。
  • DELTA_TIME:距上次采样以来线程 CPU 时间的增量,单位为秒。
  • TIME:线程累计 CPU 总时间,格式为分钟:秒
  • INTERRUPTED:线程是否处于中断状态。
  • DAEMON:是否为守护线程。

线程列表默认按 CPU 增量时间降序排列,让最活跃的线程始终排在顶部(排序逻辑见 ThreadSampler.sample())。

JVM 内部线程:观察 GC 与 JIT 的窗口

Java 8 之后,dashboard 可以获取JVM 内部线程的 CPU 时间。这些线程只有名称和 CPU 时间,没有 ID 与状态信息,因此列表中 ID 显示为-1、优先级显示为-1、状态显示为-

通过内部线程可以感知 JVM 的整体活动:

  • GC 相关:当 JVM 堆 / metaspace 空间不足或发生 OOM 时,可以看到 GC 线程的 CPU 占用明显高于其他线程——这是内存压力的早期信号。
  • JIT 相关:执行tracewatchttredefine等命令之后,可以看到 JIT 编译线程活动变得频繁。原因是 JVM 热更新类字节码时会清除与该类相关的 JIT 编译数据,需要重新编译,从而带动 JIT 线程 CPU 上升。

JVM 内部线程主要包括:

  • JIT 编译线程:如C1 CompilerThread0C2 CompilerThread0
  • GC 线程:如GC Thread0G1 Young RemSet Sampling
  • 其他内部线程:如VM Periodic Task ThreadVM ThreadService Thread

从源码看,内部线程的 CPU 时间通过 HotSpot 专有的HotspotThreadMBean.getInternalThreadCpuTimes()获取,获取失败时该能力会被自动降级关闭(见 ThreadSampler.getInternalThreadCpuTimes()),内部线程条目由 createThreadVO() 构造,ID 固定为 -1 且标记为守护线程。

Tomcat 实时统计(阿里定制版)

当目标进程运行在 Apache Tomcat Alibaba 定制版上时,dashboard 会额外展示 Tomcat 的实时统计:QPS(每秒请求数)、RT(平均响应时间)、错误数以及线程池(busy 忙线程数 / total 总线程数)。

其底层通过向本机 Tomcat 管理端口发起 HTTP 请求获取数据(addTomcatInfo()):

http://localhost:8006/connector/stats # Connector 统计:请求数、错误数、收发字节、处理时间 http://localhost:8006/connector/threadpool # 线程池统计:busy 线程与总线程数

如果请求http://localhost:8006失败,则不显示 Tomcat 信息(不会报错)。QPS、错误率、收发速率等基于SumRateCounter计算相邻两次采样之间的速率(DashboardCommand.java),RT 则用processingTime / requestCount计算平均响应时间(毫秒)。

底层实现:定时调度、CPU 采样与视图渲染

dashboard 的实现遵循 Arthas 命令标准的Model + View架构,核心逻辑集中在三个文件:

1. 定时调度与生命周期管理(DashboardCommand)

命令启动后创建守护线程Timer("Timer-for-arthas-dashboard-<sessionId>"),并以scheduleAtFixedRate-i指定的间隔反复执行采样任务(process())。生命周期支持:

  • Ctrl+C:通过DashboardInterruptHandler停止定时器退出;
  • q键:通过QExitHandler从 stdin 退出;
  • 会话挂起 / 恢复:挂起时stop()取消定时器,恢复时restart()重建并重新调度;
  • -n次数到达:任务内自动timer.cancel()并结束进程。

2. CPU 采样(ThreadSampler)

CPU% 的计算是 dashboard 的核心算法(ThreadSampler.java):

  1. 首次采样记录每个线程的ThreadMXBean.getThreadCpuTime(id)快照与采样时刻System.nanoTime(),只展示累计 TIME;
  2. 后续每次采样重新读取 CPU 时间,计算增量delta = newTime - lastTime
  3. delta / (本次采样时刻 - 上次采样时刻)得出该采样周期的 CPU 占用率,换算为百分比;
  4. 线程集合本身来自 ThreadUtil.getThreads(),它从根 ThreadGroup 递归枚举全部存活线程,再逐一封装为ThreadVO

首次采样由于没有上次快照,CPU% 显示为空;从第二次刷新起才出现真实的 CPU% 数值,这正是示例输出中Timer-for-arthas-dashboard-07b等线程出现在列表顶部的原因——dashboard 自身的采样线程在工作。

3. 面板布局(DashboardView)

渲染逻辑在 DashboardView.java:面板高度按终端尺寸动态分配——上半部分放线程 Top,下半部分切分田字格,左上是 Memory + GC,右下是 Runtime + Tomcat;终端较矮时优先保证 Memory 区至少 8 行以显示 metaspace 信息。不同区域的最大高度会互相让渡,保证一屏内信息完整可见。

4. 数据模型

一次刷新的完整数据封装在DashboardModel(线程列表、内存信息、GC 信息、Runtime 信息、Tomcat 信息五部分,见 DashboardModel.java),每个线程的字段定义见 ThreadVO.java。

使用建议与注意事项

  • 先看 CPU% 排名:连续观察 2~3 个周期,CPU% 稳定靠前的线程即是热点线程,可再用thread <id>查看其堆栈定位代码位置。
  • 配合 JVM 内部线程诊断:GC 线程 CPU 飙升时及时执行memoryheapdump或检查 metaspace 配置;执行trace/watch/tt/redefine后观察 JIT 线程活动是否符合预期。
  • 合理设置刷新间隔:默认 5000ms 对生产环境友好;需要更细粒度观察时可-i 1000甚至更小,但注意采样本身会带来少量开销。
  • 限定执行次数:在批处理或脚本场景(参见 batch-support.md)使用-n控制结束时机,避免命令无限挂起。
  • 面板高度自适应:终端窗口越大展示的线程越多,缩小终端时面板会优先保证 Memory 与 Runtime 信息可见。
  • Tomcat 统计仅在 Apache Tomcat Alibaba 定制版且 8006 管理端口可达时出现,标准 Tomcat 或其它容器下该区域会自动隐藏,属预期行为。

延伸阅读

  • commands.md:Arthas 全部命令列表
  • thread.md:单次线程快照与堆栈分析
  • memory.md:内存区域详细查看
  • vmoption.md:JVM 参数实时调整
  • redefine.md / retransform.md:类热更新,可与 dashboard 中 JIT 线程观察相互印证

【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询