CentOS Java配置怎样优化
小樊
40
2025-11-19 19:13:50
CentOS 上 Java 配置的优化路径
一 基础环境与版本选择
- 选择 JDK 17(LTS)或更高稳定版本,在多数场景下可获得更好的性能、安全补丁与容器/虚拟线程等特性支持。
- 使用包管理器安装 OpenJDK(示例):sudo yum install -y java-17-openjdk-devel;如需 Oracle JDK,请遵循其许可并配置好 JAVA_HOME/PATH。
- 环境变量建议写入全局配置(如 /etc/profile 或 /etc/profile.d/java.sh),示例:
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk
export PATH=$JAVA_HOME/bin:$PATH
- 验证:java -version、javac -version。
二 系统层面的优化
- 降低换页倾向,减少抖动:将 vm.swappiness 调整为 10(默认通常为 60),必要时更低;在 /etc/sysctl.conf 设置并 sysctl -p 生效。
- 文件与磁盘:优先使用 XFS/ext4,挂载时加上 noatime 减少元数据写入;为日志与数据目录使用独立磁盘/分区。
- 网络(短连接/高并发服务):适度优化 TCP 参数(示例)
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 8192
net.core.somaxconn = 1024
net.ipv4.ip_local_port_range = 1024 65535
执行 sysctl -p 使配置生效。
- 资源管控:关闭不必要的服务与自启项,避免与业务争用 CPU/内存/文件句柄。
三 JVM 内存与 GC 调优
- 堆大小与栈:将 -Xms 与 -Xmx 设为相同值(避免运行期扩缩堆带来的停顿),结合容器/物理内存与业务峰值设定;按需调整 -Xss(线程栈,默认通常较大,适当下调可增加可创建线程数)。
- 年轻代:可用 -Xmn 或 -XX:NewRatio 控制,常见做法是让年轻代约占堆的 1/3 左右(经验值,需压测验证)。
- 垃圾回收器选择:
- 追求低停顿与可预测停顿:优先 G1GC(-XX:+UseG1GC),并配合停顿目标等参数;
- 大堆、高吞吐批处理:可考虑 Parallel GC;
- CMS 已在 JDK 14 移除,不建议在新应用继续使用。
- 直接内存:若使用 NIO/Netty 报 DirectBuffer OOM,可设置 -XX:MaxDirectMemorySize。
- 元空间:JDK 8+ 使用 Metaspace(无 PermSize/MaxPermSize),可按需设置 -XX:MaxMetaspaceSize。
- 示例(按 16GB 内存的通用服务场景,需压测微调):
-Xms12g -Xmx12g -Xss512k -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/app/logs/heap.hprof
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/app/logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100M
四 容器与中间件场景要点
- Tomcat(若使用):
- 连接器采用 NIO/NIO2,合理设置 maxThreads(如 500)、acceptCount(如 100)、maxKeepAliveRequests(如 100);不需要时关闭 AJP。
- 内存参数通过 CATALINA_OPTS 设置,示例:CATALINA_OPTS=“-Xms4g -Xmx4g -XX:+UseG1GC”。
- Spring Boot:在 systemd 服务或启动脚本中设置 JAVA_OPTS 或环境变量 JAVA_TOOL_OPTIONS,确保容器内外一致生效。
- 通用容器:在 Docker/K8s 中显式设置容器内存上限,JVM 的 -Xmx 不应超过容器 limit,避免被 OOMKilled。
五 监控 诊断与持续优化
- GC 与内存分析:开启 GC 日志(含时间戳/日志轮转),发生 OOM 时生成 Heap Dump;使用 jstat、jstack、jmap、VisualVM、JProfiler、MAT 分析停顿、对象生命周期与泄漏根因。
- 系统层监控:结合 top/vmstat/iostat/netstat 观察 CPU、内存、I/O、网络队列与重传等指标,联动定位瓶颈。
- 调优闭环:以目标为导向(如平均停顿 < 1s、Full GC 间隔 ≥ 24h、老年代使用率常态 ≤ 70%),先采集基线、再单变量微调、压测对比,最后回归生产灰度。