恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Arthas JFR 命令完全指南:在运行中 Java 进程上动态启停 Java Flight Recorder 记录
首页
资讯中心
/
Arthas JFR 命令完全指南:在运行中 Java 进程上动态启停 Java Flight Recorder 记录
Arthas JFR 命令完全指南:在运行中 Java 进程上动态启停 Java Flight Recorder 记录
发布时间:2026/9/19 23:24:33
Arthas JFR 命令完全指南在运行中 Java 进程上动态启停 Java Flight Recorder 记录【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas本文是 Arthas 中jfr命令的完整实战指南。jfr命令允许你在程序动态运行期间启动、查询、转储和停止 Java Flight RecorderJFR记录无需重启应用即可采集 JVM 与应用的诊断数据适用于生产环境排障、性能剖析与压测分析。读完本文你将掌握jfr start / status / dump / stop四个子命令的全部参数与典型用法并理解其底层实现原理。JFR 是什么为什么要在 Arthas 中使用它Java Flight RecorderJFR是用于收集正在运行的 Java 应用程序的诊断与剖析数据的工具它集成在 Java 虚拟机JVM内部几乎不会造成性能开销因此即使在负载较高的生产环境中也可以安全使用。JFR 通过记录event事件来工作事件在特定时间点发生在 JVM 或 Java 应用程序中每个事件都有一个名称、一个时间戳和一个可选的payload有效负载。负载是与事件关联的数据例如 CPU 使用率、事件前后的 Java 堆大小、锁持有者的线程 ID 等。传统上开启 JFR 需要 JVM 启动参数或在外部使用jcmd JFR.start而 Arthas 的jfr命令把这一能力内聚到诊断交互中只要通过java -jar arthas-boot.jar挂载到目标进程即可随时开始记录、随时查看状态、随时把数据落盘。其在线交互教程英文位于 site/docs/en/doc/jfr.md中文版本见 site/docs/doc/jfr.md。注意JDK8 从8u262版本开始才支持 JFRJDK 11 默认可用。在使用jfr命令前请先确认目标 JVM 的版本满足要求。命令结构与全部参数说明jfr命令的基本运行结构是jfr cmd [actionArg]其中cmd是要执行的操作支持start、status、dump、stop四个子命令actionArg为属性名参数模式。在 JFRCommand.java 的命令描述中同样列出了这四种用法并支持 TAB 键对子命令名进行自动补全见complete方法。完整参数说明如下表参数名称参数说明cmd要执行的操作支持【startstatusdumpstop】actionArg属性名模式[n:]记录名称recording name如-n myRecording[r:]记录 id 值recording id如-r 1[dumponexit:]程序退出时是否要 dump 出 .jfr 文件默认 false[d:]延迟多久后启动 JFR 记录支持带单位配置例如 60s、2m、5h、3d不带单位就是秒默认无延迟[duration:]JFR 记录持续时间支持单位配置不带单位就是秒默认一直记录forever[s:]采集 Event 的详细配置文件server-side template默认是 default.jfc位于$JAVA_HOME/lib/jfr/default.jfc[f:]将输出转储到指定路径结果文件[maxage:]缓冲区数据最大文件记录保存时间支持单位配置不带单位就是秒默认不限制[maxsize:]缓冲区的最大文件大小支持单位配置不带单位是字节m 或 M 代表 MBg 或 G 代表 GB[state:]jfr 记录状态new、delay、running、stopped、closed其中时间的解析逻辑在源码parseTimespan方法中实现s/m/h/d后缀分别表示秒、分钟、小时、天不带单位时按纳秒数值处理大小解析逻辑在parseSize方法中实现b/k/m/g后缀分别对应字节、KB、MB、GB参见 JFRCommand.java。启动 JFR 记录最简单的启动方式是不带任何参数$ jfr start Started recording 1. No limit specified, using maxsize250MB as default.默认情况下开启的是 default 模板的 JFR 记录。从源码看start子命令在未指定-s时会自动设置settingsdefault并调用Configuration.getConfiguration(settings)加载默认采集配置当duration、maxage、maxsize均未指定时会自动兜底设置maxsize250MB见 JFRCommand.java。启动 JFR 记录并指定记录名、记录持续时间与文件保存路径$ jfr start -n myRecording --duration 60s -f /tmp/myRecording.jfr Started recording 2. The result will be written to: /tmp/myRecording.jfr当指定-f时源码会通过r.setDestination(Paths.get(filename))把录制结果直接写入目标文件未指定名称时记录会被自动命名为Recording-id形式如Recording-1、Recording-2。若指定了-d延迟参数则记录先进入delay状态并返回 scheduled to start 提示到期后才真正开始。查看 JFR 记录状态默认查看所有 JFR 记录信息$ jfr status Recording: recording1 nameRecording-1 (running) Recording: recording2 namemyRecording durationPT1M (closed)查看指定记录 id 的记录信息$ jfr status -r 1 Recording: recording1 nameRecording-1 (running)查看指定状态的记录信息$ jfr status --state closed Recording: recording2 namemyRecording durationPT1M (closed)status子命令的底层逻辑JFRCommand.java所有记录保存在一个ConcurrentHashMapLong, Recording中不指定-r且指定--state时通过findRecordingByState按状态的字符串形式new、delay、running、stopped、closed过滤否则列出全部记录若当前没有任何记录会提示No available recordings. Use jfr start to start a recording.。转储dumpJFR 记录jfr dump会输出从开始到运行该命令这段时间内的记录到 JFR 文件且不会停止jfr 记录——这在发现问题后先落盘再继续采集的场景下非常有用。指定记录输出路径$ jfr dump -r 1 -f /tmp/myRecording1.jfr Dump recording 1, The result will be written to: /tmp/myRecording1.jfr不指定文件输出路径时默认保存到arthas-output目录下$ jfr dump -r 1 Dump recording 1, The result will be written to: /tmp/test/arthas-output/20220819-200915.jfr源码中dump分支要求必须传入-r记录 id否则提示Failed to dump. Please input recording id未指定-f时通过outputFile()生成默认路径文件名为yyyyMMdd-HHmmss.jfr时间戳格式保存在 Arthas 的输出目录arthas-output下见 JFRCommand.java 与 outputFile 方法。停止 JFR 记录不指定记录输出路径默认同样保存到arthas-output目录下$ jfr stop -r 1 Stop recording 1, The result will be written to: /tmp/test/arthas-output/20220819-202049.jfr注意一条记录只能停止一次。若记录已处于closed或stopped状态再次执行jfr stop会报错Failed to stop recording, state can not be closed/stopped。也可以指定记录输出路径例如jfr stop -r 1 -f /tmp/myRecording.jfr。源码中stop分支会先把记录从 recordings 表移除检查状态后再设置 destination、执行r.stop()并r.close()释放资源见 JFRCommand.java。与dump不同stop是终止录制并最终落盘二者语义切勿混淆。通过浏览器查看 arthas-output 下的 JFR 记录默认情况下Arthas 使用 8563 端口提供 HTTP 服务该默认值定义在 arthas.properties 的arthas.httpPort8563打开 http://localhost:8563/arthas-output/ 即可在浏览器中浏览arthas-output目录下的 JFR 记录结果文件生成的 .jfr 结果文件可以用支持 JFR 格式的工具来查看例如 JDK Mission ControlJMC。此外输出目录本身也可通过配置调整arthas.outputPath属性用于指定输出路径默认值为arthas-output见 arthas.properties运行时若不指定-fdump/stop 产生的文件即落入该目录。命令使用小结与源码索引场景推荐命令直接开启默认记录250MB 上限兜底jfr start指定名称、时长与落盘路径启动jfr start -n myRecording --duration 60s -f /tmp/myRecording.jfr延迟启动如 5 小时后jfr start -d 5h列出全部/指定 id/指定状态的记录jfr status、jfr status -r 1、jfr status --state running不停止采集把已有数据落盘jfr dump -r 1 [-f path]停止记录并落盘jfr stop -r 1 [-f path]浏览器浏览结果文件打开http://localhost:8563/arthas-output/如需深入实现细节可阅读 JFRCommand.java命令参数定义与 start/status/dump/stop 分支逻辑、JFRModel.java命令输出模型以及 arthas.propertiesHTTP 端口与输出路径默认配置。将jfr与其他 Arthas 命令如thread、trace、profiler配合使用可以覆盖从实时线程状态到长期性能剖析的完整排障链路。【免费下载链接】arthasAlibaba Java Diagnostic Tool Arthas/Alibaba Java诊断利器Arthas项目地址: https://gitcode.com/gh_mirrors/ar/arthas创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考