1. Java飞行记录器
1.1. Java Flight Recorder,JFR
1.1.1. 最初是BEA公司的JRockit JVM的功能
1.1.2. 在JDK 8中,只有Oracle JVM支持JFR
1.1.3. 在JDK 11中,JFR可以在开源JVM中使用
1.2. JFR数据是JVM中事件的历史记录,可以用来诊断JVM过去的性能和操作
1.3. Java Mission Control(jmc)
1.4. 对正在运行的应用程序进行轻量级性能分析
1.4.1. 可以尽最大可能查看JVM内部信息,因为它内建于JVM中
1.4.2. 在生产环境开启后也同样有用,因为可以检查影响性能的事件
1.5. 在默认设置下,JFR的系统开销非常低:对应用程序性能的影响小于1%
1.6. 由于JFR的开销非常低,JFR的分析采样频率也相当低(至少在默认配置下)
1.7. 两个模板
-
1.7.1. 默认模板
- 1.7.1.1. 限制事件,让系统开销小于1%
-
1.7.2. 性能分析模板
1.7.2.1. 将大多数基于阈值的事件设置为每10毫秒触发一次
1.7.2.2. 开销大约为2%
2. -XX:+FlightRecorder
2.1. 开启了JFR功能
2.2. 直到记录过程本身开启之后才会有记录
2.3. 在Oracle公司的JDK 8中,你必须在-XX:+FlightRecorder标志之前设定标志:-XX:+UnlockCommercialFeatures(默认值为false)
2.4. jinfo改变它们的值并开启JFR
2.5. -XX:StartFlightRecording=string标志
3. -XX:FlightRecorderOptions=string参数
3.1. name=name
- 3.1.1. 用来标识记录的名字
3.2. defaultrecording=<true|false>
3.2.1. 是否在初始时开启记录
3.2.2. 默认值是false
3.3. settings=path
- 3.3.1. 包含JFR设置的文件名
3.4. delay=time
- 3.4.1. 记录开始前的时间
3.5. duration=time
- 3.5.1. 记录持续的时间
3.6. filename=path
- 3.6.1. 写入记录的文件名
3.7. compress=<true|false>
3.7.1. 是否压缩记录
3.7.2. 用gzip
3.7.3. 默认值是false
3.8. maxage=time
- 3.8.1. 在循环缓冲区中保存记录数据的最长时间
3.9. maxsize=size
- 3.9.1. 在循环缓冲区中保存记录数据的最大大小
4. 开启飞行记录
4.1. % jcmd process_id JFR.start [options_list]
4.2. options_list是一系列以逗号分隔的名-值对,用来控制记录方式
4.3. 使用-XX:FlightRecorderOptions=string标志时的选项完全相同
5. 启用了持续记录转储到文件中
5.1. % jcmd process_id JFR.dump [options_list]
5.2. name=name
- 5.2.1. 已经开始的记录名
5.3. filename=path
- 5.3.1. 转储文件的位置
6. 终止正在进行的记录
6.1. % jcmd process_id JFR.stop [options_list]
6.2. name=name
- 6.2.1. 要终止的记录名
6.3. discard=boolean
- 6.3.1. 如果是true,则丢弃数据,而不是写入之前提供的文件中
6.4. filename=path
- 6.4.1. 将数据写入给定的路径
7. JFR以外的工具很难获得的信息
7.1. 类加载(classloading)
7.1.1. 加载和卸载的类的数量
7.1.2. 类由哪个类加载器加载
7.1.3. 类由哪个类加载器加载
7.2. 线程统计数据(thread statistics)
7.2.1. 创建和销毁的线程数量
7.2.2. 线程转储
7.2.3. 哪些线程被阻塞在锁上(以及具体的锁)
7.3. 异常类(Throwable)
7.3.1. 应用程序使用的异常类
7.3.2. 抛出的异常和错误的数量,以及异常创建时的栈轨迹
7.4. TLAB分配(TLAB allocation)
7.4.1. 堆分配的数量和线程本地分配缓冲区(TLAB)的大小
7.4.2. 堆中分配的具体对象和它们分配时的栈轨迹
7.5. 文件和套接字I/O(file and socket I/O)
7.5.1. I/O操作的时长
7.5.2. 每个读写调用的时长,导致读写耗费大量时间的具体文件和套接字
7.6. 管程阻塞(monitor blocked)
7.6.1. 等待管程的线程
7.6.2. 阻塞具体线程的具体管程,以及被阻塞的时长
7.7. 代码缓存(code cache)
7.7.1. 代码缓存的大小和容量
7.7.2. 从代码缓存移除的方法
7.7.3. 代码缓存配置
7.8. 代码编译(code compilation)
7.8.1. 哪个方法被编译,OSR编译和编译时长
7.8.2. JFR只是统一了几个来源的信息
7.9. 垃圾回收(garbage collection)
7.9.1. GC时间(包括单个阶段)
7.9.2. 代的大小
7.9.3. JFR只是统一了几个工具的信息
7.10. 性能分析(profiling)
7.10.1. 探查分析和采样分析
7.10.2. 很多高层次的概要信息