CentOS 上 Java 性能优化实操指南
一 基础环境准备
- 选择并安装稳定的 JDK LTS 版本(如 JDK 17),保持与线上一致的小版本,及时更新安全补丁。
- 正确配置环境变量(示例):
- 编辑 /etc/profile 或 ~/.bashrc
- 添加:
- export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
- export PATH=$JAVA_HOME/bin:$PATH
- 使生效:source /etc/profile 或 source ~/.bashrc
- 验证:java -version、javac -version 返回期望版本号。
二 系统层面优化
- 降低内存交换倾向:
- 查看:cat /proc/sys/vm/swappiness(默认常见为 60)
- 建议生产设为 10(兼顾稳定性与性能):echo ‘vm.swappiness=10’ >> /etc/sysctl.conf && sysctl -p
- 文件与磁盘 I/O:
- 使用 ext4/XFS,挂载时加上 noatime 减少元数据写入。
- 网络(长连接/高并发服务):
- 示例(按需调整):
- 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.core.somaxconn=1024
- 使生效:sysctl -p
- 资源与监控:
- 关闭不必要的系统服务,释放内存与文件句柄。
- 使用 vmstat、htop、iostat 持续观察 CPU、内存、I/O、网络瓶颈。
三 JVM 参数与 GC 调优
- 堆与线程栈基线:
- 将 -Xms 与 -Xmx 设为相同,避免运行期扩缩堆带来的抖动;结合容器/物理机内存与应用特点设置上限。
- 示例:-Xms8g -Xmx8g;线程栈按并发量微调(如 -Xss256k~1m)。
- 垃圾回收器选择:
- 吞吐优先(批处理/离线任务):Parallel GC(JDK 8 默认)。
- 响应优先(Web/低停顿):G1 GC(大堆与停顿可控场景更友好)。
- 常用 GC 与安全点诊断:
- 开启 GC 日志(便于分析停顿与回收效率):
- -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps
- -Xloggc:/var/log/your-app/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100M
- OOM 时自动转储:
- -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/your-app/heapdump.hprof
- 按需添加:
- -XX:+DisableExplicitGC(避免应用误调用 System.gc() 触发 Full GC)
- 示例模板(按应用特性微调):
- G1(通用 Web/微服务):
- -Xms8g -Xmx8g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16m
- -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/app/gc.log
- -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof
- Parallel GC(吞吐优先):
- -Xms8g -Xmx8g -XX:+UseParallelGC -XX:+UseParallelOldGC
- -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/app/gc.log
- -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heapdump.hprof
- 注意:不同 JDK 版本参数存在差异,变更前在测试环境验证,并保留回滚方案。
四 Web 容器与中间件调优(以 Tomcat 为例)
- 连接器(Connector)关键参数(NIO/NIO2):
- maxThreads:工作线程上限(如 500,结合 CPU/内存与下游能力)。
- acceptCount:等待队列长度(如 100)。
- maxKeepAliveRequests:长连接复用(如 100)。
- 如无需与 Apache 通过 AJP 直连,建议关闭 AJP 连接器。
- 容器 JVM 参数注入:
- 在 bin/catalina.sh 中设置 JAVA_OPTS(或针对服务使用专用环境变量),示例:
- JAVA_OPTS=“-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -Xloggc:/usr/local/tomcat/logs/gc.log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/usr/local/tomcat/logs/heapdump.hprof”
五 监控 诊断与压测闭环
- 运行期观测:
- JMX + VisualVM/JProfiler 观察堆、线程、类加载、GC 行为;必要时远程 attach。
- 系统侧用 vmstat、htop、iostat 定位 CPU、内存、I/O 瓶颈。
- 问题定位:
- 堆转储分析:使用 Eclipse MAT 或 VisualVM 分析 OOM/内存泄漏根因。
- GC 日志分析:关注停顿时长、回收前后占用、晋升失败/并发模式失败等迹象,据此微调堆分区与回收器参数。
- 压测与回归:
- 使用 Apache JMeter 进行容量与稳定性压测,验证调优收益与回退阈值,形成基线。