To locate performance bottlenecks in Java applications, you can use a combination of JFR and JMC tools. 1. Ensure that the JDK version supports and enables JFR; 2. Record data dynamically through the command line or runtime; 3. Use JMC to analyze key indicators such as CPU, memory, GC and hotspot methods; 4. Use events and method calls to find specific bottlenecks, such as Full GC, thread blocking or I/O problems; 5. Pay attention to setting the recording time reasonably, avoiding long-term opening, and understand interface and function limitations.
Java application performance tuning is often not based on guessing, but on tools. JFR (Java Flight Recorder) and JMC (Java Mission Control) are a very practical combination, especially useful when troubleshooting performance issues in the production environment. They can help you see the details of the program running, such as GC behavior, thread state, time-consuming method execution, etc.

Let’s start from several practical perspectives and talk about how to use this set of tools to locate performance bottlenecks.
How to enable JFR and record Flight once
To use JFR, you must first make sure your JDK version supports it. OpenJDK 11 and above already has built-in JFR community version, while Oracle JDK comes with full features. When starting the application, add parameters to enable:

- Startup parameters example:
-
-XX: UnlockCommercialFeatures
-
-XX: FlightRecorder
-
There are two ways to record: one is to start recording directly through the command line, and the other is to dynamically attach it during operation.
For example, if your application is already running, you can trigger a fly through jcmd
:

jcmd <pid> JFR.start duration=60s filename=myrecording.jfr
This command will record the data for the next 60 seconds and save it as a myrecording.jfr
file. This process has little impact on system performance and is suitable for temporary sampling in production environments.
What is the most effective way to open JFR data using JMC to see
After getting the .jfr
file, open it with JMC and you can see a bunch of charts and events. But it may be a bit dazzled at the beginning, so it is recommended to focus on the following parts:
- Overview page : You can see the CPU usage, heap memory changes, GC frequency, etc. during the entire recording period, and quickly determine whether there are obvious abnormalities.
- Event Browser : Here lists all recorded event types, such as "Allocation in new TLAB" that can be used to analyze object allocation.
- Method Profiling : If you want to check hotspot methods, this item is very useful. It shows the call time and proportion of each method, helping you find the method stack with the longest execution time.
Tips: When viewing method calls, remember to switch to the "Hot Methods" view, so it is easier to find out which methods take up a lot of CPU time.
How to find performance bottlenecks in combination with JFR data
With the data, the focus is on how to interpret it. For example, if you find that an interface is slower to respond, you can search for it as follows:
- Check whether there are frequent Full GCs that cause application pauses;
- Check whether there are threads blocking for a long time or waiting for resources;
- Check the hotspot method, whether a certain business logic consumes too much CPU;
- Analyze whether I/O operations have become a bottleneck, such as slow database queries and high network latency.
To give a simple example: If you find that "Socket Read" events are frequent and time-consuming, it may be caused by slow response of external services or instability in the network. At this time, you can further investigate the call link instead of just staring at the Java code itself.
Notes and common misunderstandings
Although JFR JMC is very powerful, there are some easy places to get stuck:
- Don't keep on running JFR: Although the overhead is not large, long-term recording will generate a large amount of data, affecting disk space and performance.
- The recording time should not be too short: for example, only 5 seconds are recorded, and key events may be missed; it is recommended to adjust according to the scene, generally 30 seconds to 2 minutes are more appropriate.
- The JMC interface is a bit old: it may not be intuitive for the first time, so I will get used to it after clicking a few more times.
- Some advanced features are only available for commercial versions: for example, more detailed thread analysis, memory leak detection and other functions are not available in the community version.
Basically that's it. Once you master the basic process, you will find that this set of tools is very efficient in diagnosing complex problems and does not require additional third-party dependencies.
The above is the detailed content of Java Performance Profiling with JFR and JMC. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

The settings.json file is located in the user-level or workspace-level path and is used to customize VSCode settings. 1. User-level path: Windows is C:\Users\\AppData\Roaming\Code\User\settings.json, macOS is /Users//Library/ApplicationSupport/Code/User/settings.json, Linux is /home//.config/Code/User/settings.json; 2. Workspace-level path: .vscode/settings in the project root directory

To correctly handle JDBC transactions, you must first turn off the automatic commit mode, then perform multiple operations, and finally commit or rollback according to the results; 1. Call conn.setAutoCommit(false) to start the transaction; 2. Execute multiple SQL operations, such as INSERT and UPDATE; 3. Call conn.commit() if all operations are successful, and call conn.rollback() if an exception occurs to ensure data consistency; at the same time, try-with-resources should be used to manage resources, properly handle exceptions and close connections to avoid connection leakage; in addition, it is recommended to use connection pools and set save points to achieve partial rollback, and keep transactions as short as possible to improve performance.

DependencyInjection(DI)isadesignpatternwhereobjectsreceivedependenciesexternally,promotingloosecouplingandeasiertestingthroughconstructor,setter,orfieldinjection.2.SpringFrameworkusesannotationslike@Component,@Service,and@AutowiredwithJava-basedconfi

itertools.combinations is used to generate all non-repetitive combinations (order irrelevant) that selects a specified number of elements from the iterable object. Its usage includes: 1. Select 2 element combinations from the list, such as ('A','B'), ('A','C'), etc., to avoid repeated order; 2. Take 3 character combinations of strings, such as "abc" and "abd", which are suitable for subsequence generation; 3. Find the combinations where the sum of two numbers is equal to the target value, such as 1 5=6, simplify the double loop logic; the difference between combinations and arrangement lies in whether the order is important, combinations regard AB and BA as the same, while permutations are regarded as different;

fixture is a function used to provide preset environment or data for tests. 1. Use the @pytest.fixture decorator to define fixture; 2. Inject fixture in parameter form in the test function; 3. Execute setup before yield, and then teardown; 4. Control scope through scope parameters, such as function, module, etc.; 5. Place the shared fixture in conftest.py to achieve cross-file sharing, thereby improving the maintainability and reusability of tests.

java.lang.OutOfMemoryError: Javaheapspace indicates insufficient heap memory, and needs to check the processing of large objects, memory leaks and heap settings, and locate and optimize the code through the heap dump analysis tool; 2. Metaspace errors are common in dynamic class generation or hot deployment due to excessive class metadata, and MaxMetaspaceSize should be restricted and class loading should be optimized; 3. Unabletocreatenewnativethread due to exhausting system thread resources, it is necessary to check the number of threads, use thread pools, and adjust the stack size; 4. GCoverheadlimitexceeded means that GC is frequent but has less recycling, and GC logs should be analyzed and optimized.

Use classes in the java.time package to replace the old Date and Calendar classes; 2. Get the current date and time through LocalDate, LocalDateTime and LocalTime; 3. Create a specific date and time using the of() method; 4. Use the plus/minus method to immutably increase and decrease the time; 5. Use ZonedDateTime and ZoneId to process the time zone; 6. Format and parse date strings through DateTimeFormatter; 7. Use Instant to be compatible with the old date types when necessary; date processing in modern Java should give priority to using java.timeAPI, which provides clear, immutable and linear

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa
