JDK Flight Recorder


JDK Flight Recorder is an event recorder built into the Java virtual machine. It can be thought of as the software equivalent of a Data Flight Recorder in a commercial aircraft. It captures information about the JVM itself, and the application running in the JVM. There is a wide variety of data captured, for example method profiling, allocation profiling and garbage collection related events. The JDK Flight Recorder was designed to minimize the Observer Effect in the profiled system, and is meant to be always on in production systems. The technology was open sourced in 2018.
Analysis and visualization of flight recordings are normally done using JDK Mission Control.

Technology

A recording file consists of binary chunks of data. Each chunk is self describing and self contained. In other words, the metadata needed to make use of the data is included in the chunk. Also all the values required to be resolved through e.g. constant pools are also included in the chunk.
There is a wide variety of technologies employed to make the JFR efficient, for example:
If converting a binary recording to JSON, it can easily blow up by two orders of magnitude or more, depending on length and content recorded.
The expected performance overhead of JFR using the default template is less than a percent, and for the profiling template, less than two percent.

History

JDK Flight Recorder started out as JRockit Flight Recorder, and was originally used as a means to collect data to be used to improve the JVM itself. After Oracle acquired Sun Microsystems, JRockit Flight Recorder was rebranded Java Flight Recorder. In 2018 Java Flight Recorder was open sourced and released as part of OpenJDK 11. When open sourced it was rebranded JDK Flight Recorder, due to Java trademark issues.

Versions

These are the versions of JFR file format available. It does not encompass all the versions that have ever existed, but rather versions that exist in JVMs after the migration to HotSpot.
JFR VersionJDK Versions
v0.9Oracle JDK 7, Oracle JDK 8
v1.0Oracle JDK 9, Oracle JDK 10
v2.0Oracle JDK 11+, Open JDK 11+, Azul JDK 8 and Azul JDK 11+