CentOS Java应用性能优化
小樊
34
2025-11-15 18:45:46
CentOS 上 Java 应用性能优化实战
系统层优化
- 内核网络参数(/etc/sysctl.conf):开启端口复用与快速回收、缩短连接超时、扩大本地端口与连接队列、开启 SYN Cookie,提升高并发短连接场景的吞吐与稳定性。示例:
- net.ipv4.tcp_tw_reuse = 1
- net.ipv4.tcp_fin_timeout = 30
- net.ipv4.tcp_keepalive_time = 1200
- net.ipv4.ip_local_port_range = 1024 65535
- net.ipv4.tcp_max_syn_backlog = 8192
- net.core.somaxconn = 1024
- net.core.netdev_max_backlog = 2000
- net.ipv4.tcp_max_orphans = 32768
- net.ipv4.tcp_syncookies = 1
修改后执行:sudo sysctl -p 使配置生效。
- 服务与启动项:精简开机服务(systemctl disable 非必要服务),减少资源争用与攻击面。
- 文件系统与存储:优先使用 XFS/ext4,并做定期检查与优化(如挂载选项 noatime、合适的 stride/块大小等,视业务 I/O 模式而定)。
- 时间同步:部署 NTP 保持时钟一致,避免日志、监控与分布式系统异常(sudo yum install -y ntp && sudo systemctl enable --now ntpd)。
JVM 层优化
- 堆与元空间:将 -Xms 与 -Xmx 设为相同值(如 -Xms16G -Xmx16G)以避免运行期扩缩堆带来的抖动;按需设置元空间(如 -XX:MetaspaceSize=… -XX:MaxMetaspaceSize=…)。
- 垃圾回收器:优先选择 G1GC(如 -XX:+UseG1GC),在吞吐与停顿之间取得平衡;面向低延迟可适当调节停顿目标(如 -XX:MaxGCPauseMillis=…)。
- GC 日志与诊断:开启结构化 GC 日志,便于定位停顿与晋升问题(如 -Xlog:gc,gc+heap=debug,gc+age=trace:file=gc.log:time,tags*;兼容旧版可用 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log)。
- 启动与类加载:启用类数据共享(-Xshare:on)降低类加载开销;精简依赖、延迟初始化以缩短启动时间。
- 运行时与编译器:优先使用 JDK 17/21 等 LTS 版本获取性能与安全改进;JIT 默认已启用,避免滥用 -Xcomp(可能导致启动慢与抖动)。
应用与中间件层优化
- 通用代码与资源:减少临时对象创建、重用对象/对象池;选择高效算法与数据结构(如 ArrayList 在多数随机访问/尾部插入场景优于 LinkedList);避免资源泄漏(文件、DB 连接等);降低锁竞争(如 ConcurrentHashMap);必要时使用异步与缓存(如 Redis/Memcached)。
- Web 容器示例(Tomcat):合理设置连接器并发参数(如 maxThreads=500、acceptCount=100),采用 NIO/NIO2 提升 I/O 效率;不需要时禁用 AJP;根据队列与业务峰值调优队列与超时,避免雪崩与线程饥饿。
监控与压测闭环
- 监控与剖析:使用 JProfiler/VisualVM 实时观测 CPU、堆、线程与锁;用 jstack/jmap 抓取线程栈与堆转储;用 MAT 分析内存泄漏与对象生命周期;对 GC 日志做趋势与停顿分析。
- 压测与回归:以 JMeter 等工具进行容量与稳定性压测,覆盖峰值 QPS、长稳运行与异常场景;每次变更先在测试环境验证,再灰度上线,持续观察 GC、RT、吞吐与错误率。
快速落地清单
- 基线:记录当前 CPU、内存、I/O、网络、GC 停顿、99/95 线 RT、QPS/错误率;明确优化目标(如 P99 RT ≤ 200ms、Full GC = 0、CPU 利用率 ≤ 70%)。
- 系统:应用上述 sysctl 调优;精简服务;时间同步;I/O 调度与文件系统按负载选型。
- JVM(示例,按容器/物理机内存调整):-Xms16G -Xmx16G -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+PrintGCApplicationStoppedTime -Xlog:gc*,gc+heap=debug:file=gc.log:time,tags;必要时 -Xshare:on。
- 应用:连接池(如 HikariCP)与超时配置、异步化、缓存、减少锁竞争与对象分配;Tomcat 按并发调 maxThreads/acceptCount/NIO。
- 验证:压测→监控→定位瓶颈→回滚/再调优→固化参数与基线;保留 GC 日志与堆转储用于复盘。