Java性能优化实战技巧与最佳实践分享
1、简述
性能优化是 Java 开发中永恒的话题,无论是高并发系统、响应式服务、还是数据密集型处理程序,都离不开系统性、可验证的性能调优方法。本文从 JVM、代码层、集合框架、多线程、IO、数据库及工具链等多维度总结 Java 性能优化实战技巧,并给出完整可运行的实践示例。
性能优化黄金原则,在做任何“优化”之前,请牢记:
不要凭感觉优化
必须先用工具检测瓶颈。
局部优化往往无效
性能通常受瓶颈点约束(Amdahl 定律)。
能用现成的框架,不自己造轮子
JDK 官方方法和高性能库通常已经过大量优化。
先优化算法,再优化代码
算法复杂度的收益远超代码微调。
2、JVM 层性能优化
实战技巧 1:合理设置堆大小 + 垃圾回收器
默认 JVM 参数不适合生产环境。
常规推荐:
-Xms4g -Xmx4g -XX:+UseG1GC
适合响应式服务:
-XX:+UseZGC
用例:观察 GC 日志
java -Xms2g -Xmx2g -XX:+UseG1GC -Xlog:gc* MyApp
通过 GC 日志可分析:
- Young GC 频率
- STW 停顿时间
- 堆碎片情况
实战技巧 2:使用对象池,但不要滥用
适用场景:对象创建成本极高,可复用对象
不适用:小对象、简单业务对象(JVM 优化很快)
用例:线程池的对象池化
ExecutorService pool = Executors.newFixedThreadPool(20);
相比每次创建线程,复用线程显著提升性能、减少上下文切换。
3、代码层性能优化
实战技巧 3:避免不必要的装箱与拆箱
错误:
Integer sum = 0;
for (int i = 0; i < 10000; i++) {
sum += i; // 自动装箱 + 拆箱
}
正确:
int sum = 0;
实战技巧 4:不要在循环中创建对象
错误:
for (int i = 0; i < 10000; i++) {
StringBuilder sb = new StringBuilder(); // 频繁创建
}
正确:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10000; i++) {
sb.setLength(0);
}
4、集合框架性能优化
实战技巧 5:为集合指定初始容量
避免 HashMap 和 ArrayList 的扩容开销。
用例:哈希表
Map<String, Object> map = new HashMap<>(1024);
用例:ArrayList 扩容问题
错误:
List<Integer> list = new ArrayList<>(); for (int i = 0; i < 10000; i++) list.add(i);
正确:
List<Integer> list = new ArrayList<>(10000);
扩容成本可减少 80% 以上。
实战技巧 6:尽量使用 “for-each + Iterator” 而非 Stream(高频场景)
Stream 是优雅,但并不总是性能最佳。
Stream 对象创建与 Lambda 闭包捕获都有开销。
高频循环时:
for (int i : list) {
}
往往比:
list.stream().forEach(i -> {});
更快。
5、并发 & 多线程优化
实战技巧 7:使用并行流需谨慎
并行流使用 ForkJoinPool.commonPool,可能导致业务线程竞争。
避免在 Web 服务(尤其 tomcat/netty)中使用:
list.parallelStream()....
除非指定自定义线程池。
实战技巧 8:使用无锁优化(CAS)
AtomicInteger 是无锁 CAS,比 synchronized 快。
用例:
AtomicInteger counter = new AtomicInteger();
public void increment() {
counter.incrementAndGet();
}
实战技巧 9:减少线程切换
CPU 最耗时的不是计算,而是线程调度。
减少线程池创建:
ExecutorService pool = Executors.newVirtualThreadPerTaskExecutor();
JDK 21 虚拟线程几乎无切换成本,是高并发利器。
6、IO 与文件处理性能优化
实战技巧 10:使用 NIO 替代传统 IO
通过 FileChannel 与 ByteBuffer 提升 IO 吞吐。
用例:NIO 文件读取
try (FileChannel channel = FileChannel.open(path)) {
ByteBuffer buffer = ByteBuffer.allocate(8192);
while (channel.read(buffer) > 0) {
buffer.flip();
buffer.clear();
}
}
吞吐可提升 2-5 倍。
7、数据库性能优化
实战技巧 11:使用批处理批量写入
错误:
for (...) {
pstmt.executeUpdate();
}
正确:
pstmt.addBatch(); pstmt.executeBatch();
吞吐量可提升一个数量级。
实战技巧 12:使用连接池
推荐:
- HikariCP(最快)
- Druid(监控好)
示例配置(Hikari):
HikariConfig config = new HikariConfig(); config.setMaximumPoolSize(20); config.setConnectionTimeout(3000); HikariDataSource ds = new HikariDataSource(config);
8、工程与工具链层优化
实战技巧 13:使用 JMH 进行微基准测试
JMH 是 Oracle 官方的 Java 基准测试框架。
示例:
@Benchmark
public void testAdd() {
int x = a + b;
}
实战技巧 14:使用性能分析工具定位瓶颈
常用工具:
| 工具 | 用途 |
|---|---|
| JFR | JVM profiling、GC、CPU 偏差 |
| VisualVM | 线程、堆、代码热点分析 |
| Arthas | 热点监控,线上排障 |
| YourKit | 企业级性能分析 |
9、综合实战案例:百万数据处理优化
需求:处理百万条数据,统计字段并写入文件。
原始代码(性能差)
List<String> results = new ArrayList<>();
for (Item item : items) {
results.add(item.process());
}
Files.write(path, results);
性能瓶颈
✓ ArrayList 多次扩容
✓ 频繁操作文件 IO
✓ 单线程串行处理
优化后代码
List<String> results = new ArrayList<>(items.size());
items.parallelStream() // 利用多核
.map(Item::process)
.forEach(results::add);
Files.write(path, results, StandardOpenOption.CREATE);
进一步优化可采用:
- 分批写文件
- 使用 NIO FileChannel
- 使用虚拟线程并发
10、总结
Java 性能优化的核心:
- 先定位,再优化
- 避免无意义对象创建
- 让数据结构与场景匹配
- 合理利用线程池和无锁技术
- IO 与数据库必须批量化、池化
- 使用 JMH/JFR/Arthas 等工具验证优化效果
只有系统性、可量化的优化方法,才能构建真正高性能的 Java 服务。
到此这篇关于Java性能优化实战技巧与最佳实践分享的文章就介绍到这了,更多相关Java性能优化技巧与实践内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot整合RedisTemplate实现缓存信息监控的步骤
这篇文章主要介绍了SpringBoot整合RedisTemplate实现缓存信息监控,一步一步的实现 Springboot 整合 Redis 来存储数据,读取数据,需要的朋友可以参考下2022-01-01


最新评论