摘要:序本文主要研究一下的使用。执行顺序的话,先再,最后。内置了相关,可以用来解析文件,也可以在应用程序自定义事件发布出来可以采用命令启动,也可以使用的开头的命令在运行时操作,非常方便
序
本文主要研究一下Java Flight Recorder的使用。
命令主要有5个命令,configure、check、start、dump、stop。执行顺序的话,先start再dump,最后stop。
JFR.configure参数 | 描述 | 值类型 | 默认值 |
---|---|---|---|
globalbuffercount | 指定global buffers的数量. 修改 memorysize参数会影响该值. | Long | 默认值依赖 memorysize 参数. |
globalbuffersize | 指定global buffers大小, 单位bytes. 修改 memorysize 参数会影响到global buffers. | Long | 默认值依赖 memorysize 参数. |
maxchunksize | 指定单个data chunk的最大值, 单位bytes | Long | 12582912 |
memorysize | 指定总内存大小, 单位bytes | Long | 10485760 |
repositorypath | 指定recordings在写入到持久化文件之前的存储路径 | String | 默认为系统临时目录,Oracle Solaris以及Linux是/tmp.windows系统的话,取TMP环境变量值 |
stackdepth | 指定stack traces的Stack depth | Long | 64 |
thread_buffer_size | 指定每个thread的Local buffer size, 单位bytes. 不建议修改此参数,可能会降低性能 | Long | 8192 |
threadbufferstodisk | 是否允许thread buffers在buffer thread阻塞的时候直接写到磁盘 | Boolean | false |
samplethreads | 是否开启thread sampling | Boolean | true |
命令实例
jcmd 5793 JFR.configure 5793: Current configuration: Repository path: /private/var/folders/9r/v55wkcr91m5_g8h7lhgjzgr00000gn/T/2018_09_27_16_30_53_5793 Stack depth: 64 Global buffer count: 20 Global buffer size: 512.0 kB Thread buffer size: 8.0 kB Memory size: 10.0 MB Max chunk size: 12.0 MB Sample threads: trueJFR.start
参数 | 描述 | 值类型 | 默认值 |
---|---|---|---|
delay | 指定延时多长时间才开始记录 | Integer类型加s表示秒, m表示分钟, 或者h表示小时 | 0s |
disk | 记录的时候是否写数据到磁盘 | Boolean | true |
dumponexit | 是否在JVM关闭时写记录到磁盘. 如果为true但没有指定filename, 则文件名为系统生成,包含process ID, recording ID,以及 current time stamp (例如,hotspot-pid-47496-id-1-2018_01_25_19_10_41.jfr),文件路径为进程启动路径 . | Boolean | false |
duration | 指定记录时长 | Integer类型加s表示秒, m表示分钟, 或者h表示小时 | 0s (forever) |
filename | 指定停止时记录数据的文件路径,如果未指定,则使用进程使用目录,例如recording.jfr`/home/user/recordings/recording.jfr`c: ecordings ecording.jfr | String | No default value |
maxage | 指定记录数据在磁盘的最大存活时间,当disk参数为true时才有效 | Integer类型加s表示秒, m表示分钟, 或者h表示小时 | 0s (forever) |
maxsize | 指定记录数据在磁盘的最大大小,默认单位bytes,指定m或M表示兆,g或G表示G,只有当disk参数为true时才有效,该值不能比maxchunksize参数值小. | Long | 0 (no maximum size) |
name | 指定记录文件名,如未指定则默认生成. | String | 默认为系统生成. |
path-to-gc-roots | JDK 10引入的,指定在记录结束前要收集的GC Roots的路径.该参数有助于排查内存泄露,但是收集比较耗时,当且仅当怀疑有内存泄露时才启用。如果settings参数设置为profile, 则收集的信息包括潜在内存泄露对象的stack trace. | Boolean | false |
settings | 指定记录的配置文件,如果不是JRE_HOME/lib/jfr目录下的要指定全路径,要指定多个的话,用逗号分隔。默认路径有default.jfc: 该配置开销低,可以用于持续运行.profile.jfc: 则提供比default更多的数据,但是开销大一些,对性能有所影响,适合短时间收集信息用 | String | JRE_HOME/lib/jfr/default.jfc |
命令实例
jcmd 5793 JFR.start name=demojfr dumponexit=true 5793: Started recording 1. No limit specified, using maxsize=250MB as default. Use jcmd 5793 JFR.dump name=demojfr filename=FILEPATH to copy recording data to file.JFR.check
参数 | 描述 | 值类型 | 默认值 |
---|---|---|---|
name | 指定文件名 | String | No default value |
verbose | 是否打印event settings | Boolean | false |
命令实例
jcmd 5793 JFR.check 5793: Recording 1: name=demojfr maxsize=250.0MB (running)JFR.dump
参数 | 描述 | 值类型 | 默认值 |
---|---|---|---|
filename(required) | 指定dump写入的路径,如果未指定,则使用进程启动的目录,例如:recording.jfr`/home/user/recordings/recording.jfr`c: ecordings ecording.jfr | String | No default value |
name(required) | 指定要dump的记录 | String | No default value |
path-to-gc-roots | JDK 10引入的,指定在记录结束前要收集的GC Roots的路径.该参数有助于排查内存泄露,但是收集比较耗时,当且仅当怀疑有内存泄露时才启用. | Boolean | false |
命令实例
jcmd 5793 JFR.dump name=demojfr filename=/tmp/demo.jfr 5793: Dumped recording "demojfr", 480.8 kB written to: /tmp/demo.jfrJFR.stop
参数 | 描述 | 值类型 | 默认值 |
---|---|---|---|
filename | 指定停止时数据写入的路径.如果没有指定则默认为进程启动的目录,例如recording.jfr`/home/user/recordings/recording.jfr`c: ecordings ecording.jfr | String | No default value |
name | 指定要stop的记录的名称 | String | No default value |
命令实例
jcmd 5793 JFR.stop name=demojfr 5793: Stopped recording "demojfr".JMC
JMC打开jfr文件实例截图如下:
@Test public void testReadJfr() throws IOException { Path p = Paths.get(getClass().getClassLoader().getResource("demo.jfr").getPath()); Listevents = RecordingFile.readAllEvents(p); events.stream() .forEach(e -> LOGGER.info("eventType:{},startTime:{},endTime:{},fields:{}",e.getEventType().getName(),e.getStartTime(),e.getEndTime(),e.getFields())); List eventNames = events.stream() .map(e -> e.getEventType().getName()) .distinct() .collect(Collectors.toList()); System.out.println(eventNames.toString()); }
直接使用jdk的api即可以解析jfr文件,读出RecordedEvent
eventType类型输出如下:
[jdk.ExceptionStatistics, jdk.NativeMethodSample, jdk.ThreadSleep, jdk.JavaMonitorWait, jdk.CPULoad, jdk.JavaThreadStatistics, jdk.ClassLoadingStatistics, jdk.CompilerStatistics, jdk.ClassLoaderStatistics, jdk.ModuleExport, jdk.CodeCacheStatistics, jdk.CodeSweeperStatistics, jdk.GCConfiguration, jdk.ActiveSetting, jdk.ActiveRecording, jdk.InitialSystemProperty, jdk.InitialEnvironmentVariable, jdk.CPUInformation, jdk.CPUTimeStampCounter, jdk.ThreadAllocationStatistics, jdk.PhysicalMemory, jdk.NativeLibrary, jdk.CompilerConfiguration, jdk.CodeCacheConfiguration, jdk.CodeSweeperConfiguration, jdk.IntFlag, jdk.UnsignedIntFlag, jdk.LongFlag, jdk.UnsignedLongFlag, jdk.DoubleFlag, jdk.BooleanFlag, jdk.StringFlag, jdk.ThreadEnd, jdk.ThreadCPULoad, jdk.NetworkUtilization, jdk.ThreadStart, jdk.ThreadContextSwitchRate, jdk.GCSurvivorConfiguration, jdk.GCTLABConfiguration, jdk.GCHeapConfiguration, jdk.YoungGenerationConfiguration, jdk.SystemProcess, jdk.ThreadDump, jdk.JVMInformation, jdk.OSInformation, jdk.ModuleRequire]
除了系统定义的eventType,还可以自定义event自定义event
DemoEvent
@Label("Demo Event") @Description("Helps the programmer getting started") public class DemoEvent extends Event { @Label("Message") private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
发布事件
DemoEvent event = new DemoEvent(); event.setMessage("hello, world!"); event.commit();
之后使用api解析jfr文件,可以看到自定义的event,其name为com.example.jfr.DemoEvent相关模块
可以使用如下参数启动-XX:StartFlightRecording=duration=120s,filename=/tmp/event.jfr,settings=default,name=DemoEventRecording
JDK11关于jfr的模块有两个,分别是jdk.jfr.jmod以及jdk.management.jfr.jmod,其具体内容如下:
➜ jmods ../bin/jmod describe jdk.jfr.jmod jdk.jfr@11 exports jdk.jfr exports jdk.jfr.consumer requires java.base mandated qualified exports jdk.jfr.internal.management to jdk.management.jfr contains jdk.jfr.events contains jdk.jfr.internal contains jdk.jfr.internal.cmd contains jdk.jfr.internal.consumer contains jdk.jfr.internal.dcmd contains jdk.jfr.internal.handlers contains jdk.jfr.internal.instrument contains jdk.jfr.internal.jfc contains jdk.jfr.internal.settings contains jdk.jfr.internal.test contains jdk.jfr.internal.types platform macos-amd64 ➜ jmods ../bin/jmod describe jdk.management.jfr.jmod jdk.management.jfr@11 exports jdk.management.jfr requires java.base mandated requires java.management transitive requires jdk.jfr requires jdk.management provides sun.management.spi.PlatformMBeanProvider with jdk.management.jfr.internal.FlightRecorderMXBeanProvider contains jdk.management.jfr.internal platform macos-amd64小结
Java Flight Recorder是一款优秀的java应用诊断工具,以前是商业版的特性,现在在java11当中开源出来,它导出的jfr文件可以用Java Mission Control来分析。
JDK11内置了相关API,可以用来解析jfr文件,也可以在应用程序自定义事件发布出来
JFR可以采用JVM命令启动,也可以使用jcmd的JFR.开头的命令在运行时操作,非常方便
docUsing Java Flight Recorder
Java Flight Recorder Cheat Sheet
2 Diagnostic Command Reference
Clarifying some confusion around Java Flight Recordings
Java Flight Recorder:The Secret Arrow in Your Quiver
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77295.html
摘要:从版本开始,不再单独发布或者版本了,有需要的可以自己通过去定制官方解读官方细项解读稳步推进系列六的小试牛刀一文读懂的为何如此高效弃用引擎 Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要讲述一下Java11的新...
摘要:千呼万唤,于正式发布版本即,也就是官方推荐可以广泛使用的版本,其中发布了包括等个新特性,让我们一睹为快。一新特性一览二发布计划日期阶段说明对进入阶段的变化会应用越来越严格的审查。我们需要支持以保持竞争力并与最新标准保持同步。 千呼万唤,JDK11于2018-09-25正式发布GA版本(GA即General Availability,也就是官方推荐可以广泛使用的版本),其中发布了包括ZG...
摘要:来来来,花分钟看看的七大新特性,还有代码样例。本地是指方法内的变量声明。从开始,这个正式进入标准库包。同步请求会阻止当前线程。可喜的是,如果尝试改变不可变集合,会通过发出警告是在中引入的,增加了三个新方法。 现在Java有多元化的发展趋势,既有JS又有C++还有C#的影子,不学习那是不行滴。来来来,花5分钟看看Java9-Java11的七大新特性,还有代码样例。Java11 发布了,然...
摘要:到年将提供修复和安全更新。中期版本将每六个月发布一次。将扩展类文件格式以支持新的常量池形式。将提供一个低开销的数据收集框架,用于对应用程序和进行故障排除。项目负责人表示,维护成本和低使用率并不能证明其保留是合理的。将是第一个获得支持的平台。 Java JDK 11删除了CORBA,Java EE和JavaFX支持,但添加了十几个主要新功能。 Java Development Kit(J...
摘要:前几天的北京阿里云峰会,阿里巴巴正式宣布对外开源长期支持版本。此次,阿里巴巴发布的预览版本对应的版本。同时对于阿里云,会针对的两个版本和随阿里云镜像发布,免费提供给阿里云客户使用。年月,发布,根据阿里大数据场景的定制版发布。 前几天的北京阿里云峰会,阿里巴巴正式宣布对外开源 OpenJDK 长期支持版本 Alibaba Dragonwell。作为 Java 全球管理组织 Java Co...
阅读 2140·2021-09-04 16:40
阅读 1419·2021-08-13 15:07
阅读 3580·2019-08-30 15:53
阅读 3174·2019-08-30 13:11
阅读 1031·2019-08-29 17:22
阅读 1762·2019-08-29 12:47
阅读 1447·2019-08-29 11:27
阅读 2199·2019-08-26 18:42