Sometimes you may want to start up a flight recording at JVM start up, or perhaps at a fixed time after JVM start. Perhaps you want a recording from how your application behaved whilst loading/setting up, or maybe you want to start the recording at exactly the same time after JVM start-up, so that it is easier to compare recordings from different runs. Another reason may be that application is so fantastically busy working, that it starves the poor threads involved in JMX communication, making connecting with tools a pain.
No matter what, here are examples on how to get your flight recordings done from the command line.
Using JVM startup-flags
Here is an example on how to start up a one minute recording 20 seconds after the start of the JVM:
-XX:+UnlockCommercialFeatures -XX:+FlightRecorder -XX:StartFlightRecording=delay=20s,duration=60s,name=MyRecording,filename=C:\TEMP\myrecording.jfr,settings=profile
The settings parameter takes either the path to, or the name of, a template. The templates contain the settings, per event type, that the recording will use. The default ones that are shipped with the JDK are located in the jre/lib/jfr folder. Note that using the settings parameter will require either a JRockit or a Hotspot 7u40 or later.
Another good parameter to change, if you want more information on what is going on, is the log level:
For more information on the various parameters and options, see Oracle JRockit: The Definitive Guide. They are pretty much exactly the same for both Hotspot and JRockit.
If you want to start a recording from the command line after the fact that you have started the JVM, that is possible too. JCMD, which I described in a previous blog, has a set of commands dedicated to controlling the Flight Recorder.
Here is how to kick off a recording using jcmd:
jcmd <pid> JFR.start delay=20s duration=60s name=MyRecording filename=C:\TEMP\mycraprecording.jfr settings=profile
Note that <pid> is the process identifier of the Java process you want to start recording. The easist way to find it is probably to run jcmd without parameters.
Updated the blog to reflect that 7u12 has been relabeled to 7u14 because of the critical security release.
And now it seems numbering may change to >17.
Yep, numbering will be > 17 for sure. *sigh*
And it seems the final bid is 7u40. 🙂
[…] from the normal command line flags to control the FlightRecorder (see this blog), there are some flags that are especially useful in the context of the method sampling […]