Tomcat在Linux上的内存管理技巧
堆内存是Tomcat存储对象实例的主要区域,合理设置初始堆(-Xms)和最大堆(-Xmx)是内存管理的核心。建议将两者设置为相同值(如-Xms2048m -Xmx4096m),避免JVM因堆空间不足频繁触发Full GC(导致应用暂停)。设置时需遵循:-Xmx不超过物理内存的80%(预留内存给系统和其他进程),-Xms不低于物理内存的1/64(默认值可能过小,无法满足大型应用需求)。例如,若服务器有8GB物理内存,-Xmx可设置为6-7GB,-Xms设置为2-3GB。
非堆内存用于存储类信息、常量、静态变量等,通过-XX:PermSize(初始大小)和-XX:MaxPermSize(最大大小)配置(Java 8及以上替换为-XX:MetaspaceSize和-XX:MaxMetaspaceSize)。默认情况下,两者均为物理内存的1/64,但对于使用大量第三方JAR包或动态生成类的应用(如Spring Boot),需适当增大。例如,-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m,避免OutOfMemoryError: PermGen space错误。
垃圾回收(GC)是影响Tomcat内存效率的关键因素。根据应用场景选择合适的GC器:
-XX:+UseG1GC(G1垃圾收集器),通过-XX:MaxGCPauseMillis=200设置最大GC暂停时间(如200ms),平衡吞吐量与延迟;-XX:+UseConcMarkSweepGC(CMS垃圾收集器),通过-XX:CMSInitiatingOccupancyFraction=70设置老年代占用70%时触发GC,减少Full GC频率。-XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps参数,将GC日志输出到文件,便于分析GC频率和耗时。为快速定位内存泄漏问题,需开启内存溢出时的堆转储功能:-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/logs/heapdump.hprof。当发生OutOfMemoryError时,JVM会自动生成堆转储文件,使用MAT(Memory Analyzer Tool)或VisualVM工具分析,可快速定位泄漏对象(如大量未释放的集合、静态变量)。
top(查看进程内存占用)、free -h(查看系统内存剩余)、jstat -gc <pid>(查看GC统计信息,如Eden区、老年代使用率)等命令,实时监控Tomcat内存状态;/etc/security/limits.conf,增加Tomcat用户的进程数和内存限制(如tomcat hard nproc 65535、tomcat soft memlock 8G),避免因系统限制导致内存无法充分利用。修改catalina.sh后,重启Tomcat(./shutdown.sh && ./startup.sh),通过以下命令验证内存参数是否生效:
# 获取Tomcat进程ID
pgrep -f "org.apache.catalina.startup.Bootstrap"
# 查看堆内存设置
jmap -heap <pid>
输出中需包含MaxHeapSize(最大堆大小)、NewRatio(老年代与新生代比例)等参数,确认与配置一致。