第九章:JVM与性能优化
9.4 性能优化技巧
1. 代码层面的优化
1.1 减少对象创建
- 避免频繁创建临时对象:例如在循环中创建对象会增加垃圾回收压力。
- 使用对象池:如数据库连接池(HikariCP)、线程池(ThreadPoolExecutor)等。
1.2 字符串操作优化
- 使用
StringBuilder或StringBuffer替代字符串拼接(+操作符)。 - 避免在循环中重复调用
String.intern()。
1.3 循环优化
- 减少循环内的计算:将不变量提取到循环外。
- 使用增强型
for循环(for-each)遍历集合,避免手动索引操作。
2. 集合与数据结构优化
2.1 选择合适的集合类
- 根据场景选择
ArrayList(随机访问快)或LinkedList(插入删除快)。 - 使用
HashMap时设置合理的初始容量和负载因子,避免扩容开销。
2.2 避免不必要的装箱/拆箱
- 优先使用基本数据类型(如
int而非Integer),减少内存占用和GC压力。
3. 内存管理优化
3.1 控制堆内存大小
- 通过
-Xms和-Xmx参数合理设置JVM堆内存,避免频繁Full GC。 - 使用
-XX:+UseG1GC或-XX:+UseZGC选择适合的垃圾回收器。
3.2 避免内存泄漏
- 及时释放资源:关闭数据库连接、IO流等。
- 使用弱引用(
WeakReference)管理缓存,防止强引用导致对象无法回收。
4. 并发优化
4.1 减少锁竞争
- 使用局部变量或线程封闭(ThreadLocal)避免共享资源竞争。
- 考虑无锁数据结构(如
ConcurrentHashMap、AtomicInteger)。
4.2 合理使用线程池
- 根据任务类型(CPU密集型/IO密集型)设置线程池大小。
- 避免任务队列过长导致内存溢出。
5. JVM参数调优
5.1 常用参数示例
# 启用G1垃圾回收器
-XX:+UseG1GC
# 设置新生代与老年代比例
-XX:NewRatio=2
# 启用并行垃圾回收
-XX:+UseParallelGC
5.2 监控与调整
- 使用
jstat、VisualVM监控GC日志,调整参数如-XX:MaxGCPauseMillis(最大GC停顿时间)。
6. 其他技巧
- 缓存热点数据:如使用
Caffeine或Ehcache。 - 延迟初始化:对资源密集型对象使用懒加载(Lazy Initialization)。
- JIT优化:避免在热点代码中使用反射或动态代理。
示例代码:字符串拼接优化
// 不推荐:频繁创建String对象
String result = "";
for (int i = 0; i < 1000; i++) {
result += i;
}
// 推荐:使用StringBuilder
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append(i);
}
String result = sb.toString();
通过结合代码优化、JVM调优和并发策略,可以显著提升Java应用的性能。实际优化时需结合性能分析工具(如Arthas、JProfiler)定位瓶颈。
