Performance Analysis

Using performance analysis, administrators can obtain recommendations to improve the performance of Java applications running on managed instances in the fleet. For selected Java Application, JMS will start JFR recording on application's JVM, once the recording is completed the JMS plugin will upload the JFR file into OCI.

The final step is the analysis of the JFR files and creating a report with recommendations for application's JVM configuration. Always verify the recommended values for your applications, before making the changes in production environments. Finding best JVM configuration to achieve your performance goals can be tricky, there are things to consider that JMS cannot imply just from analyzing the JVM Flight Recorder events, if in doubt, don't hesitate to contact our value engineering team https://www.oracle.com/java/java-se-subscription/value-engineering/.

OCI Cloud Console

  1. Sign in to the OCI Console as an administrator.
  2. Open the navigation menu, click Observability & Management, and then click Fleets under Java Management.
  3. Select your fleet.
  4. Click Managed instances and then click on the managed instance where the application is running.
  5. Click Applications and select the application on which the performance analysis should be started.
  6. Click Actions and select Start Performance Analysis.
  7. Click Start.
  8. Once the work request is finished, click Performance analysis reports.

OCI CLI

  1. Create targets payload template using the following command:
    oci jms fleet request-performance-tuning-analyses --generate-param-json-input
        targets
  2. Find details about your application, for example with:
    [
      {
        "applicationInstallationKey": "$APP_INSTALL_KEY",
        "applicationKey": "$APP_KEY",
        "jreKey": "$APP_JRE_KEY",
        "managedInstanceId": "$MANAGED_INSTANCE_OCID"
      }
    ]
  3. Execute the following command:
    oci jms fleet request-performance-tuning-analyses --fleet-id $FLEET_OCID
          --recording-duration-in-minutes $RECORDING_DURATION --targets file://targets.json

Example

In the following example we will use the same application as we used for demonstration of the crypto analysis feature:

#!/usr/bin/env bash
 
# configuration variables
FLEET_OCID=ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta
MANAGED_INSTANCE_OCID=ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq
APP_NAME=spring-tls-server
 
# get application key
APP_KEY=$(oci jms application-installation-usage-summary summarize-application-installation-usage --display-name-contains $APP_NAME --fleet-id $FLEET_OCID | jq -r '.data.items[]."application-key"')
 
# start performance analysis on specified managed instance
WORK_REQUEST_OCID=$(oci jms fleet request-performance-tuning-analyses \
    --fleet-id "$FLEET_OCID" \
    --recording-duration-in-minutes 15 \
    --targets "[{\"managedInstanceId\":\"$MANAGED_INSTANCE_OCID\",\"applicationKey\":\"$APP_KEY\"}]" | jq -r '."opc-work-request-id"')
 
echo $WORK_REQUEST_OCID

Once the performance analysis work request is finished, we can check the result with the following API calls, or we can check the JMC OCI Cloud console:

#!/usr/bin/env bash
 
# configuration variables
APP_NAME=spring-tls-server-1.1.0.jar
FLEET_OCID=ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta
MANAGED_INSTANCE_OCID=ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq
WORK_REQUEST_OCID=ocid1.jmsworkrequest.oc1.eu-frankfurt-1.aaaaaaaavcnv2khspnmu7aj7bjlg2c7rytar7an7wbidhmvgm2fnbr6mvx4a
 
# get jms report location in object storage service related to our work request, the output will print namespace, bucket-name and object-name
oci jms  performance-tuning-analysis-result list \
    --fleet-id $FLEET_OCID \
    --sort-by timeCreated \
    --sort-order DESC \
    --all \
    --application-name=$APP_NAME \
    --managed-instance-id "$MANAGED_INSTANCE_OCID" | jq -r ".data.items[]| select(.\"work-request-id\"==\"$WORK_REQUEST_OCID\") | .namespace,.\"bucket-name\",.\"object-name\""
 
# namespace, bucket-name and name parameters where taken from the report payload above
oci os object get \
    --namespace frmss8xk2qta \
    --bucket-name jms_ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta \
    --name JMS/ANALYSIS/PERFTUNING/RESULTS/ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta/ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq/PerfTuningAnalysisResult-20250714094533-ocid1.jmsworkrequest.oc1.eu-frankfurt-1.aaaaaaaavcnv2khspnmu7aj7bjlg2c7rytar7an7wbidhmvgm2fnbr6mvx4a-9379a93c-1f35-4574-b528-266d6f8f9984.json
 
{
  "applicationName": "spring-tls-server-1.1.0.jar",
  "applicationId": "afecbb29e4f96bc9c87c5138a26877bd713305696e4f909af2c8947065e0c7cf",
  "applicationInstallationId": "36be37c500e042eeef9e7aa52c294bbafd51556a90fd4eaae0c6ce099939d77c",
  "jfrFileName": "JMS/JFR/ocid1.jmsfleet.oc1.eu-frankfurt-1.amaaaaaaptiaquqa2qxxkco6hrguz7nyug2hcpgikhe5gz4d7uy6j6ilbtta/ocid1.instance.oc1.eu-frankfurt-1.antheljtptiaquqcrjmnu7mxbjthm2jm5qzryu7xy4w27rfo56nxf4uwv6pq/20250714092917_479_0_1840025_0_spring-tls-server-1.1.0.jar.jfr",
  "timeAnalyzed": "2025-07-14T09:45:33.022837159Z",
  "summary": {
    "warnings": [
      {
        "key": 1,
        "code": "G1GCSmallerNewSizeFromMaxGCPauseMillisRule",
        "description": "Decrease Young generation size to achieve lower pauses",
        "message": "Current MaxGCPauseMillis (-2ms) is far from the actual average Young GC time (13.95ms). Setting smaller young generation may reduce average Young GC time. For example, this can be achieved by reducing -XX:MaxNewSize=40m. ",
        "currentVmOptions": "",
        "recommendedVmOptions": "-Xmn40894464",
        "detailsLink": "https://docs.oracle.com/en/java/javase/guides/vm/gctuning/g1_gc_tuning.html#g1_gc_tuning ",
        "comment": ""
      },
      ...
    ],
    "currentVmOptions": "",
    "recommendedVmOptions": "-Xmn39m -XX:MetaspaceSize=92m -Xmx238m -Xms238m -XX:MaxHeapSize=238m -XX:MinHeapSize=238m -XX:InitialHeapSize=238m -XX:+AlwaysPreTouch"
  },
  "version": "1.0"
}