要优化Tomcat内存,首先需通过日志识别内存瓶颈(如内存泄漏、频繁GC等)。Tomcat的主要日志文件位于/var/log/tomcat/(或/opt/tomcat/logs/)目录下,其中catalina.out记录了核心运行信息。可使用以下命令分析日志:
tail -f /var/log/tomcat/catalina.out(观察是否有OutOfMemoryError、GC overhead limit exceeded等错误);grep -i "error\|exception\|oom" /var/log/tomcat/catalina.out(快速定位内存相关异常);GC记录(如[GC (Allocation Failure)),说明堆内存可能不足或存在内存泄漏。根据日志分析结果,通过修改Tomcat启动脚本catalina.sh(位于/opt/tomcat/bin/)调整JVM内存设置,核心参数如下:
-Xms:设置JVM堆的初始内存(如-Xms512m),建议与-Xmx一致,避免堆内存动态扩展带来的性能损耗;-Xmx:设置JVM堆的最大内存(如-Xmx1024m),需根据服务器物理内存调整(通常不超过物理内存的70%,例如4GB内存可设为-Xmx2800m)。-XX:NewSize:年轻代初始大小(如-XX:NewSize=256m);-XX:MaxNewSize:年轻代最大大小(如-XX:MaxNewSize=512m);-XX:NewRatio:年轻代与老年代的比例(如-XX:NewRatio=2表示年轻代占堆的1/3,老年代占2/3,适用于大多数应用)。-XX:MetaspaceSize:元空间初始大小(如-XX:MetaspaceSize=64m);-XX:MaxMetaspaceSize:元空间最大大小(如-XX:MaxMetaspaceSize=128m),避免元空间溢出。-XX:+UseG1GC开启,可提升大内存应用的GC效率;-XX:MaxGCPauseMillis=200(设置最大GC停顿时间为200ms)。示例配置(catalina.sh中添加):
export JAVA_OPTS="$JAVA_OPTS -server -Xms1024m -Xmx2048m -XX:NewSize=512m -XX:MaxNewSize=1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+UseG1GC"
过多的日志输出会增加I/O压力,间接影响内存使用。需通过以下方式精简日志:
conf/logging.properties文件,将生产环境的日志级别从INFO改为WARN或ERROR(如org.apache.catalina.level = WARN),减少不必要的调试日志输出;logrotate工具自动管理日志文件(避免单个日志文件过大)。创建/etc/logrotate.d/tomcat配置文件,内容如下:/opt/tomcat/logs/catalina.out {
rotate 14 # 保留14个备份
daily # 每天轮转一次
copytruncate # 复制原日志后清空(不影响Tomcat运行)
compress # 压缩旧日志
notifempty # 空日志不轮转
missingok # 日志不存在时不报错
}
logging.properties,将ConsoleHandler替换为AsyncFileHandler(如java.util.logging.ConsoleHandler.level = FINE改为org.apache.juli.AsyncFileHandler.level = FINE),减少日志记录对主线程的阻塞。优化后需持续监控内存使用情况,确保配置合理:
jmap命令查看堆内存使用情况(sudo jmap -heap <Tomcat进程ID>,进程ID可通过ps -ef | grep tomcat获取);jstat命令查看GC频率和耗时(如sudo jstat -gcutil <Tomcat进程ID> 1000,每秒刷新一次);WARN及以上级别日志,便于排查问题;