Java Performance Optimization and Profiling Techniques
Jul 31, 2025 am 03:58 AMUse performance analysis tools to locate bottlenecks, use VisualVM or JProfiler in the development and testing stage, and give priority to Async-Profiler in the production environment; 2. Reduce object creation, reuse objects, use StringBuilder to replace string splicing, and select appropriate GC strategies; 3. Optimize collection usage, select and preset initial capacity according to the scene; 4. Optimize concurrency, use concurrent collections, reduce lock granularity, and set thread pool reasonably; 5. Tune JVM parameters, set reasonable heap size and low-latency garbage collector and enable GC logs; 6. Avoid reflection at the code level, replace wrapper classes with basic types, delay initialization, and use final and static; 7. Continuous performance testing and monitoring, combined with JMH microbenchmark testing and APM tools, regularly analyze logs and dump files; Java performance optimization needs to be measured first and then optimized, and the tools and methods are correct to effectively improve system performance.
Java performance optimization and performance analysis are key links to improve application response speed, reduce resource consumption, and ensure system stability. Especially in scenarios with high concurrency and large data volume, reasonable optimization strategies can significantly improve system performance. The following are several core Java performance optimization directions and commonly used performance analysis technologies.

1. Positioning performance bottlenecks: Use performance analysis tools (Profiling Tools)
Before optimizing, bottlenecks must be positioned first. Blind optimization often results in half with twice the effort. Commonly used Java performance analysis tools include:
-
JVisualVM / VisualVM
Free, lightweight, integrated in JDK. It can monitor CPU and memory usage, perform thread analysis and heap dump analysis, which is suitable for preliminary investigation. JProfiler
Commercial tools, powerful functions, support CPU sampling, memory analysis, thread deadlock detection, I/O monitoring, etc., and have a friendly graphical interface.-
YourKit
Another commercial performance analyzer supports remote monitoring and method-level performance tracking, suitable for production environment sampling. Async-Profiler
Open source, low-overhead Linux performance analysis tool, based on sampling, supports CPU, memory allocation, and lock competition analysis, which is especially suitable for use in production environments.
Recommendation: Use VisualVM or JProfiler in the development and testing phases; prioritize Async-Profiler in the production environment to avoid excessive burden on the system.
2. Key optimization directions
(1) Reduce object creation and GC pressure
Frequent object creation increases the burden of garbage collection (GC), resulting in increased pause times.
Optimization suggestions:
- Use object pools (such as
ThreadLocal
cache, custom pool) to reuse objects (suitable for objects with short life cycles and frequent creation). - Avoid creating temporary objects in loops.
- Use
StringBuilder
instead of string stitching (especially in loops). - Select the appropriate GC strategy (such as G1, ZGC, Shenandoah) to reduce pause time.
// Avoid writing String result = ""; for (String s: list) { result = s; // Create a new String object every time} // Change to StringBuilder sb = new StringBuilder(); for (String s: list) { sb.append(s); }
(2) Optimize collection usage
Collections are the most commonly used structure in Java, and improper use can cause performance problems.
suggestion:
- Choose the appropriate collection type according to the scene:
-
ArrayList
is suitable for random access,LinkedList
is only used when intervening/deleting intermediate elements frequently. -
HashMap
looks fast, but pay attention to the initial capacity and load factor to avoid frequent capacity expansion.
-
- Preset the initial capacity of the set to reduce the overhead of dynamic expansion:
List<String> list = new ArrayList<>(1000); Map<String, Integer> map = new HashMap<>(512);
(3) Concurrency and thread optimization
In multi-threaded programming, lock competition and context switching are common performance killers.
Optimization suggestions:
- Use concurrent collections (such as
ConcurrentHashMap
,CopyOnWriteArrayList
) instead of synchronous wrapper classes. - Reduce lock granularity and avoid time-consuming operations (such as I/O) within the lock.
- Consider using lock-free structures (such as
AtomicInteger
,LongAdder
). - Set the thread pool size reasonably to avoid the overhead of context switching caused by too many threads:
// CPU-intensive: Number of threads ≈ number of CPU cores // I/O-intensive: The number of threads can be appropriately increased ExecutorService executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
(4) JVM parameter tuning
Reasonable JVM parameter settings are crucial to performance.
Key parameter suggestions:
- Heap size:
-Xms
and-Xmx
are set to the same value to avoid dynamic expansion. - Choose the right garbage collector:
- G1GC: Suitable for large piles (above 4G), pursuing low latency.
- ZGC/Shenandoah: Ultra-low pause (<10ms), suitable for delay-sensitive applications (JDK 11/12).
- Enable GC logs for easy analysis:
-Xlog:gc*,gc heap=debug,gc compaction=info:file=gc.log:time,tags
3. Code-level performance skills
Avoid overuse of reflection
Low reflection performance and difficult to optimize. If necessary, you can cacheMethod
object or useMethodHandle
.Use basic types to replace packaging classes
Usingint
in collections is better thanInteger
and can be supported viaIntStream
or third-party libraries such asfastutil
.Delay initialization and lazy loading
For large objects or time-consuming operations, useSupplier
or double check locks to achieve lazy loading.Optimization using
final
andstatic
JVM has better inline optimization opportunities forfinal
fields and static methods.
4. Performance testing and monitoring
Optimization is not one-time and requires continuous monitoring and verification.
- Use JMH (Java Microbenchmark Harness) to perform microbenchmark testing to avoid incorrect performance measurements.
- Integrate APM tools (such as SkyWalking, Pinpoint, New Relic) for real-time monitoring in production environments.
- Regularly analyze GC logs, thread dumps, and heap dumps.
Basically that's it. Java performance optimization is not "magic", but "science": measure first, then optimize; bottleneck first, then details . If the tool is used correctly, the direction is half right.
The above is the detailed content of Java Performance Optimization and Profiling Techniques. 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)

Hot Topics

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.

Selecting the Java SpringBoot React technology stack can build stable and efficient full-stack web applications, suitable for small and medium-sized to large enterprise-level systems. 2. The backend uses SpringBoot to quickly build RESTfulAPI. The core components include SpringWeb, SpringDataJPA, SpringSecurity, Lombok and Swagger. The front-end separation is achieved through @RestController returning JSON data. 3. The front-end uses React (in conjunction with Vite or CreateReactApp) to develop a responsive interface, uses Axios to call the back-end API, and ReactRouter

Use performance analysis tools to locate bottlenecks, use VisualVM or JProfiler in the development and testing stage, and give priority to Async-Profiler in the production environment; 2. Reduce object creation, reuse objects, use StringBuilder to replace string splicing, and select appropriate GC strategies; 3. Optimize collection usage, select and preset initial capacity according to the scene; 4. Optimize concurrency, use concurrent collections, reduce lock granularity, and set thread pool reasonably; 5. Tune JVM parameters, set reasonable heap size and low-latency garbage collector and enable GC logs; 6. Avoid reflection at the code level, replace wrapper classes with basic types, delay initialization, and use final and static; 7. Continuous performance testing and monitoring, combined with JMH

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.

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;

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

JavaFlightRecorder(JFR)andJavaMissionControl(JMC)providedeep,low-overheadinsightsintoJavaapplicationperformance.1.JFRcollectsruntimedatalikeGCbehavior,threadactivity,CPUusage,andcustomeventswithlessthan2%overhead,writingittoa.jfrfile.2.EnableJFRatsta
