I have a Java program which I am trying to improve. I suspect synchronized blocks within the code to hurt performance but I would like to make sure this is my problem before touching my code.
To check if synchronized blocks are indeed the issue, I recorded the execution of my program on a test server with Flight Recorder, downloaded the created jfr
file on my desktop and opened it with Java Mission Control. However the Lock Instances
page in Java Application
does not show anything. The only clue I get is a message in the Results view which reads:
The Java Blocking rule requires event(s) to be available from the following event types: com.oracle.jdk.JavaMonitorEnter
I am therefore assuming there must be some kind of option to activate along with the flight recorder but I wasn't able to find it so far.
How do you enable events from the com.oracle.jdk.JavaMonitorEnter
type to be recorded by the Java Flight Recorder ?
Or I am missing something else and there is a better way to figure out how much blocking on synchronized blocks is done in a Java program ?
I am using Oracle JDK version 1.8.0_191. The version of Java Mission Control I am using on my desktop is 6.0.0. Finally, the command I use to record my program's execution is the following:
java -XX:+UnlockCommercialFeatures -XX:+UnlockDiagnosticVMOptions -XX:+DebugNonSafepoints -XX:+FlightRecorder -XX:StartFlightRecording=settings=profile,dumponexit=true,filename=test.jfr -classpath lib/*:src/ <my program with its arguments>
I should also add that connecting to the server directly with Java Mission Control is not an option (or is it?) as I am using an ssh rebound to actually connect to it ...
JDK Mission Control is an advanced set of tools that enables efficient and detailed analysis of the extensive of data collected by Java Flight Recorder. The tool chain enables developers and administrators to collect and analyze data from Java applications running locally or deployed in production environments.
The resultant Java Flight Recorder file can be analyzed using Java Mission Control. To start Java Mission Control run $JAVA_HOME/jmc. Once started, using menu File / Open File, one can then browse to the flight recorder file.
Java Flight Recorder – a standard profiling tool shipped as part of the JDK. Async Profiler – a very accurate profiler that can also collect native call and memory allocation data.
A liitle more research on my own provided me with the answer.
The JavaMonitorEnter events (and other events that one would like to monitor) need to be specified in a flight recorder configuration file. In this situation, I was using the profile
configuration which is provided along with the default
configuration with the Oracle JDK.
I created my own configuration using Java Mission Control. This blog was very helpful in presenting how to find the tool to create custom recording configurations in Java Mission Control.
I then exported my newly created configuration, uploaded it on my test environment and specified this configuration in my command (below the modified option only):
-XX:StartFlightRecording=settings=/home/<username>/Custom,<other options>...
What my problem actually was
Blocking recordings are activated in the flight recorder configurations provided by the Oracle JDK. However, for the blockings to actually be recorded, they need to last for more than a certain threshold (20ms in the default
configuration, 10ms in the profile
configuration).
In my application, individual blockings were shorter than this threshold, hence nothing appeared when I opened my recording in Java Mission Control.
My main source of confusion was the message stating that the "Java Blocking rule required events to be available ...". A more accurate description of my situation would be that no blockings exceeding the configuration threshold were recorded.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With