转储部分Java飞行记录
Dump part of Java Flight Record
假设我使用以下标志为我的 JVM 配置了连续飞行记录
java
-XX:StartFlightRecording=disk=false,dumponexit=true
-XX:FlightRecorderOptions=memorysize=200m
-jar
....
据我了解,此配置最多可在内存中存储 200mb 的热点事件,当达到限制时丢弃最早的。
要转储我正在通过 jcmd
使用 JFR.dump
命令的记录。还有一种通过任务控制提取记录的替代方法,但由于其中的错误,我没有成功提取 运行 在任务控制的 JVM 之外的记录。令人惊讶的是,MBean 服务器管理工作正常。
无论如何,我看到可以通过任务控制的“转储”功能指定要从连续记录中转储的间隔范围,例如从 2021-01-01 13:00:00 到 2021-01- 01 14:00:00。假设当前时间是 2021-01-02 17:00:00。如何通过 JFR.dump
指定相同的间隔?查看 JFR.dump 参考,没有任何标志可以做到这一点。那么任务控制是如何做到的呢?
注意:我使用的是 JMC 8 和 Oracle JDK 11 0 10u8。
不幸的是,link 你在搜索引擎中的排名很高,但已经六岁了。你可以找到最新的文档 here (JDK 16),它与 JDK 11.
非常相似
无法转储部分基于内存的记录。在您的示例中,您必须删除 'disk=false' 和 -XX:FlightRecorderOptions,并将 'maxsize=200M' 添加到 -XX:StartFlightRecording:
$ java -XX:StartFlightRecording:maxsize=200M -jar ...
那么你可以这样做:
$ jcmd <pid> JFR.dump begin=2021-01-01T13:00:00 end=2021-01-01T14:00:00
日期时间格式为 ISO-8601,这是 LocalDataTime.toString() 和 Instant.toString() 生成的格式。
如果您省略结束时间,JFR.dump 将假定它应该在您执行转储时结束,如果您指定相对时间,它将相对于转储时间。
例如转储最后一小时:
$ jcmd <pid> JFR.dump begin=-1h
也可以使用maxage参数来限制数据,例如:
$ jcmd <pid> JFR.dump maxage=1h
maxsize参数可以用来指定包含多少数据,例如:
$ jcmd <pid> JFR.dump maxsize=50MB
另一种方法是创建两个基于磁盘的记录:
$ java -XX:StartFlightRecording:maxsize=200M,name=sized
-XX:StartFlightRecording:maxage=1h,name=aged
-jar ...
$ jcmd <pid> JFR.dump name=aged
两次录制的开销与一次相同。
(我不太关心基于磁盘的记录的开销。JFR 中的所有数据都是无锁写入并由后台线程刷新。磁盘和内存之间的开销差异通常无法衡量)
假设我使用以下标志为我的 JVM 配置了连续飞行记录
java
-XX:StartFlightRecording=disk=false,dumponexit=true
-XX:FlightRecorderOptions=memorysize=200m
-jar
....
据我了解,此配置最多可在内存中存储 200mb 的热点事件,当达到限制时丢弃最早的。
要转储我正在通过 jcmd
使用 JFR.dump
命令的记录。还有一种通过任务控制提取记录的替代方法,但由于其中的错误,我没有成功提取 运行 在任务控制的 JVM 之外的记录。令人惊讶的是,MBean 服务器管理工作正常。
无论如何,我看到可以通过任务控制的“转储”功能指定要从连续记录中转储的间隔范围,例如从 2021-01-01 13:00:00 到 2021-01- 01 14:00:00。假设当前时间是 2021-01-02 17:00:00。如何通过 JFR.dump
指定相同的间隔?查看 JFR.dump 参考,没有任何标志可以做到这一点。那么任务控制是如何做到的呢?
注意:我使用的是 JMC 8 和 Oracle JDK 11 0 10u8。
不幸的是,link 你在搜索引擎中的排名很高,但已经六岁了。你可以找到最新的文档 here (JDK 16),它与 JDK 11.
非常相似无法转储部分基于内存的记录。在您的示例中,您必须删除 'disk=false' 和 -XX:FlightRecorderOptions,并将 'maxsize=200M' 添加到 -XX:StartFlightRecording:
$ java -XX:StartFlightRecording:maxsize=200M -jar ...
那么你可以这样做:
$ jcmd <pid> JFR.dump begin=2021-01-01T13:00:00 end=2021-01-01T14:00:00
日期时间格式为 ISO-8601,这是 LocalDataTime.toString() 和 Instant.toString() 生成的格式。
如果您省略结束时间,JFR.dump 将假定它应该在您执行转储时结束,如果您指定相对时间,它将相对于转储时间。
例如转储最后一小时:
$ jcmd <pid> JFR.dump begin=-1h
也可以使用maxage参数来限制数据,例如:
$ jcmd <pid> JFR.dump maxage=1h
maxsize参数可以用来指定包含多少数据,例如:
$ jcmd <pid> JFR.dump maxsize=50MB
另一种方法是创建两个基于磁盘的记录:
$ java -XX:StartFlightRecording:maxsize=200M,name=sized
-XX:StartFlightRecording:maxage=1h,name=aged
-jar ...
$ jcmd <pid> JFR.dump name=aged
两次录制的开销与一次相同。
(我不太关心基于磁盘的记录的开销。JFR 中的所有数据都是无锁写入并由后台线程刷新。磁盘和内存之间的开销差异通常无法衡量)