1. 定位性能瓶颈:明确优化方向
使用性能监控工具定位瓶颈是调优的基础。系统层面,可通过top(查看进程CPU/内存占用)、htop(增强版top,支持交互)、vmstat 1(监控CPU、内存、I/O等实时数据)、iostat -x 1(分析磁盘I/O瓶颈)、netstat -nutlp(查看网络连接状态)等命令快速识别资源占用高的进程或组件;Java应用层面,借助jstack <pid>(生成线程转储,分析线程阻塞/死锁)、jmap -heap <pid>(查看堆内存使用情况)、jstat -gcutil <pid> 1000(监控GC频率与停顿时间)、VisualVM(图形化监控堆内存、线程、类加载等)或Arthas(动态诊断工具,支持方法级性能分析)定位具体瓶颈(如CPU过高可能是算法低效,内存增长快可能是内存泄漏,GC频繁可能是堆内存不足)。
2. JVM调优:优化内存管理与GC
JVM调优是Java应用性能提升的关键,需根据应用场景(如高并发、低延迟、大数据量)调整参数:
-Xms)和最大堆(-Xmx)(建议两者相等,避免堆扩展带来的停顿),如-Xms4g -Xmx4g;根据应用对象生命周期调整年轻代(-Xmn)与老年代比例(-XX:NewRatio,如-XX:NewRatio=3表示年轻代占1/4堆内存),减少Minor GC频率。-XX:+UseG1GC),适合大内存(>4GB)应用;若需更低的停顿时间(如<10ms),可使用ZGC(-XX:+UseZGC,需JDK 11+)或Shenandoah(-XX:+UseShenandoahGC)。调整G1GC参数:-XX:MaxGCPauseMillis=200(目标最大停顿时间)、-XX:G1HeapRegionSize=4m(Region大小,根据堆大小调整)。-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/path/to/gc.log),使用GCViewer或GCEasy工具分析日志,识别Full GC频率、停顿时间过长等问题。3. 代码优化:减少资源消耗与提升效率
代码层面的优化能直接降低JVM负担:
String str = new String("abc")改为String str = "abc"),使用对象池(如Apache Commons Pool)重用昂贵的对象(如数据库连接、线程)。ArrayList适合随机访问,LinkedList适合频繁插入/删除)、算法(如用HashMap替代TreeMap提升查找效率),避免嵌套循环等低效操作。synchronized方法拆分为synchronized块),使用并发包中的无锁数据结构(如ConcurrentHashMap、AtomicInteger),避免死锁(如按固定顺序获取锁)。-XX:+TieredCompilation,默认开启),提升热点代码的编译效率;调整内联深度(-XX:InlineSmallCode=1000、-XX:MaxInlineLevel=15),优化方法内联。4. 系统配置优化:提升底层资源利用率
CentOS系统配置的优化能为Java应用提供更好的运行环境:
/etc/sysctl.conf,调整以下参数:net.ipv4.tcp_tw_reuse=1(复用TIME_WAIT连接,减少TCP资源占用)、net.ipv4.tcp_max_syn_backlog=8192(增加SYN队列长度,应对高并发连接)、vm.swappiness=10(减少Swap使用,提升内存访问速度)、fs.file-max=65535(增加系统最大文件描述符数);执行sysctl -p使配置生效。systemctl list-unit-files --type=service查看运行中的服务,禁用不需要的服务(如bluetooth、cups),减少系统资源消耗。ext4或XFS文件系统(XFS适合大文件和高并发场景),定期执行fsck检查文件系统完整性,优化磁盘I/O性能。5. 数据库与缓存优化:减少I/O等待
数据库通常是Java应用的性能瓶颈,需重点优化:
EXPLAIN分析SQL语句,添加合适的索引(如覆盖索引、联合索引),避免全表扫描;减少子查询、SELECT *(只查询需要的字段),优化JOIN操作(如小表驱动大表)。HikariCP,默认配置已较优),调整连接池参数:maximumPoolSize(根据数据库负载设置,如10-20)、connectionTimeout=3000(连接超时时间)、idleTimeout=600000(空闲连接超时时间),避免连接泄漏(如使用try-with-resources确保连接关闭)。Redis、Memcached)存储热点数据(如商品信息、用户会话),减少数据库查询次数;设置合理的缓存过期时间(如TTL=3600s),避免缓存雪崩(如批量过期)。6. 监控与持续优化:形成闭环
性能调优不是一次性工作,需持续监控与调整:
Prometheus(采集指标)+Grafana(可视化)监控Java应用的JVM指标(堆内存、GC、线程)、系统指标(CPU、内存、磁盘I/O、网络);使用SkyWalking、Pinpoint等APM工具监控应用性能(接口响应时间、SQL执行时间、调用链路)。JMeter、Gatling等工具模拟高并发场景,测试应用在不同负载下的性能表现,验证调优效果(如调整线程池大小后,接口响应时间是否下降)。