java程序如何优化
代码层面优化
使用高效的数据结构和算法,例如在频繁查找操作中使用HashMap而非ArrayList。避免不必要的对象创建,尤其在循环内实例化对象会增加GC压力。
// 反面示例:循环内创建对象
for (int i = 0; i < 10000; i++) {
String str = new String("example");
}
// 优化版:对象复用
String baseStr = "example";
for (int i = 0; i < 10000; i++) {
String str = baseStr;
}
JVM参数调优
根据应用特性调整堆内存大小和垃圾回收器。对于低延迟应用可选用G1或ZGC,高吞吐场景适合Parallel GC。设置合理的初始堆(-Xms)和最大堆(-Xmx)避免动态扩容开销。
# G1 GC配置示例
java -Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar app.jar
并发处理优化
利用CompletableFuture或并行流处理CPU密集型任务,注意线程池大小设置(建议CPU核数+1)。IO密集型任务可使用NIO或异步框架如Netty。
// 并行流示例
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.parallelStream().mapToInt(i -> i*2).sum();
缓存策略
对热点数据采用多级缓存架构,本地缓存可用Caffeine,分布式缓存选用Redis。注意缓存失效策略和雪崩保护。
// Caffeine缓存示例
Cache<String, Object> cache = Caffeine.newBuilder()
.maximumSize(10_000)
.expireAfterWrite(5, TimeUnit.MINUTES)
.build();
数据库交互优化
使用连接池(HikariCP)、批处理操作和合理索引。JPA应用开启二级缓存,MyBatis配置懒加载。
-- 索引优化示例
CREATE INDEX idx_user_email ON users(email);
性能监控与分析
通过Arthas、JProfiler等工具定位瓶颈,关注CPU/内存/IO指标。JMH进行基准测试验证优化效果。
# Arthas命令示例
watch com.example.Service queryParams '{params,returnObj}' -x 3
编译与运行时优化
启用JIT编译器优化参数,如-XX:+AggressiveOpts。对于热点方法考虑使用@HotSpotIntrinsicCandidate注解。
网络与IO优化
采用零拷贝技术,大文件传输使用FileChannel.transferTo()。HTTP客户端选择OkHttp或异步WebClient。

// 零拷贝示例
FileChannel source = new FileInputStream(src).getChannel();
FileChannel dest = new FileOutputStream(dst).getChannel();
source.transferTo(0, source.size(), dest);






