温馨提示×

CentOS Java应用性能调优技巧

小樊
34
2026-01-02 00:55:20
栏目: 编程语言

CentOS 上 Java 应用性能调优要点

JVM 与 GC 基础配置

  • 堆大小建议将 -Xms-Xmx 设为相同,避免运行期扩缩堆带来的抖动;例如:-Xms4g -Xmx4g
  • 垃圾回收器选择:
    • JDK 8 默认是 Parallel GC(吞吐优先);
    • 大堆(如 >20GB)或需更可控停顿可优先 G1 GC-XX:+UseG1GC);
    • CMS 已在后续 JDK 中被标记为废弃,不建议在新项目中使用。
  • 开启并滚动 GC 日志,便于定位停顿与回收行为:
    • -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/var/log/app/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100M
    • OOM 时自动落盘堆转储:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heap.hprof

容器与中间件调优

  • Tomcat(若使用):
    • 连接器采用 NIO/NIO2,提升并发 I/O;按需调整 maxThreads(如 500)、acceptCount(如 100)、maxKeepAliveRequests(如 100);不需要时关闭 AJP
    • bin/catalina.sh 中设置 JAVA_OPTSCATALINA_OPTS,加入堆与 GC 参数并重启生效。
  • 通用线程与连接:
    • 合理设置应用线程池与 数据库连接池(如 HikariCP),避免线程/连接风暴;
    • 减少锁竞争,优先使用并发容器(如 ConcurrentHashMap)。

操作系统与网络优化

  • 减少换页,提升响应:调低 vm.swappiness(如 10),避免应用内存被过早换出。
  • 文件 I/O:使用 ext4 并挂载 noatime,降低元数据更新带来的写放大。
  • 网络:适度优化 TCP 队列与超时,如 net.ipv4.tcp_fin_timeoutnet.ipv4.tcp_max_syn_backlog,提升高并发下的连接处理能力。
  • 资源限制:提升进程可打开文件描述符上限,例如 ulimit -n 65535,避免 “Too many open files”。

监控与诊断流程

  • 资源与进程:
    • 实时资源:top -p $(jps | grep YourApp | awk '{print $1}')
    • JVM 概览:jstat -gc <pid> 1s 观察 YGC/YGCT、FGC/FGCT 与晋升行为。
  • 线程与锁:
    • 抓取线程栈:jstack <pid> > thread_dump.txt,分析 RUNNABLE/BLOCKED/WAITING 状态与死锁。
  • 内存泄漏:
    • 发生 OOM 时自动生成 heap.hprof,用 MAT 或 VisualVM 分析支配树与泄漏路径;必要时手动 jmap -dump 抓取。
  • 持续压测与回归:使用 JMeter 等工具在预发/灰度环境进行负载与耐久测试,验证调优收益与稳定性。

常见场景与参数示例

  • 吞吐优先(批处理/离线任务,JDK 8 默认 Parallel GC):
    • -Xms8g -Xmx8g -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:ParallelGCThreads=$(nproc)
  • 响应时间优先(大堆、低停顿,G1 GC):
    • -Xms16g -Xmx16g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16m
  • 快速定位问题的通用开关:
    • -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/var/log/app/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=100M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/app/heap.hprof
  • 注意:不同 JDK 版本/GC 实现 参数差异较大,变更前在测试环境验证,并遵循“一次只改一处、对比基线”的原则。

0