Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Monitoring Locks with Java Flight Recorder and Java Mission Control

What I want to do

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.

How I went on about it

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.

My question

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 ?

My environment

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 ...

like image 453
Patrick Avatar asked Nov 26 '18 05:11

Patrick


People also ask

What is the use of Java Mission Control?

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.

How do you analyze a Java flight recorder?

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.

What is Java Flight Recorder in Intellij?

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.


1 Answers

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.

like image 198
Patrick Avatar answered Sep 22 '22 18:09

Patrick