温馨提示×

centos下tomcat内存如何调优

小樊
34
2025-11-29 19:30:35
栏目: 智能运维

CentOS 下 Tomcat 内存调优实操指南

一 配置入口与原则

  • 推荐在 $CATALINA_HOME/bin/setenv.sh 中设置环境变量(文件不存在则新建),避免在 catalina.sh 内直接修改;如使用系统服务包,也可在 /etc/sysconfig/tomcat/etc/default/tomcat 中设置 JAVA_OPTS。设置完成后执行:sudo systemctl restart tomcat。原则是:将 -Xms-Xmx 设为相同以避免运行期扩缩堆带来的停顿;堆大小一般不超过物理内存的 50%~80%,并预留内存给 元空间 Metaspace本地内存(Direct Memory/NIO)操作系统与Page Cache

二 关键 JVM 参数与版本差异

  • 常用参数说明
    • 堆与栈:-Xms/-Xmx(初始/最大堆,建议等值)、-Xss(线程栈,默认约 512KB,过高会减少可创建线程数,过低易栈溢出)。
    • 元空间(JDK 8+):-XX:MetaspaceSize=… -XX:MaxMetaspaceSize=…(替代已废弃的 PermGen)。
    • GC 选择:大堆(如 ≥6GB)且关注停顿时间时优先 -XX:+UseG1GC,可配合 -XX:MaxGCPauseMillis=… 设定目标暂停时间;吞吐优先可考虑并行 GC。
    • 故障排查:开启 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/ 便于分析 OOM。
  • 版本差异与示例
    • JDK 7 及以下(PermGen):
      • 示例:JAVA_OPTS="-Xms2g -Xmx2g -XX:PermSize=256m -XX:MaxPermSize=512m -XX:+UseG1GC"
    • JDK 8+(Metaspace):
      • 示例:JAVA_OPTS="-Xms4g -Xmx4g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/"

三 监控与诊断

  • 实时观察 GC 与内存:jstat -gcutil <pid> 1000(每 1s 输出一次),关注 YGC/YGCT、FGC/FGCT、GCT 等指标变化。
  • 堆转储与分析:发生 OOM 或手动触发时执行 jmap -dump:live,format=b,file=heap.hprof <pid>,再用 jhat 或 VisualVM/MAT 分析对象分布与泄漏根因。
  • 线上建议接入 Prometheus + Grafana 等监控告警,持续跟踪堆、GC、线程与类加载等指标。

四 常见场景与建议配置

  • 小内存实例(如 2GB 内存):JAVA_OPTS="-Xms1g -Xmx1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/"
  • 中等内存实例(如 8GB 内存):JAVA_OPTS="-Xms6g -Xmx6g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=500 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/"
  • 大内存与低停顿(如 16GB 内存):JAVA_OPTS="-Xms12g -Xmx12g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/log/ -XX:G1ReservePercent=15"(可按应用对象生命周期适当调节 G1ReservePercent)。
  • 说明:堆上限通常取物理内存的 1/2~3/4 并留足余量;若应用大量使用 NIO/DirectBuffer,需额外预留本地内存;线程栈 -Xss 常用 512KB~1MB,过高会限制并发线程数,过低可能 StackOverflowError

五 易错点与排查路径

  • -Xms-Xmx 设为不同值会引发运行期堆扩缩导致停顿;堆过大导致单次 Full GC 时间过长;-Xss 过大/过小都会影响并发与稳定性。
  • JDK 8+ 仍配置 PermSize/MaxPermSize 不会生效;应改用 Metaspace 参数。
  • 仅修改 catalina.sh 而未使用 setenv.sh 或服务环境变量,可能导致变更不生效或被包管理脚本覆盖。
  • 出现 OutOfMemoryError: Java heap space 时,先开启并分析堆转储;若是 MetaspaceDirect Memory,需分别调整 MetaspaceSize/MaxMetaspaceSize 与 NIO/缓存策略。

0