1. 调整JVM堆内存参数
在Tomcat的bin/catalina.sh文件中(Linux环境),通过JAVA_OPTS变量配置堆内存参数,这是优化内存使用的核心步骤。关键参数包括:
-Xms:设置JVM启动时的初始堆内存(如-Xms512m),建议与-Xmx保持一致,避免堆内存频繁扩容导致的性能波动;-Xmx:设置JVM可使用的最大堆内存(如-Xmx2G),通常建议为服务器物理内存的70%-80%(需预留内存给系统和其他进程);-Xss:设置每个线程的堆栈大小(如-Xss256k),默认值通常足够,过多线程会占用大量内存,需根据应用线程需求调整。JAVA_OPTS="-server -Xms1G -Xmx2G -Xss256k"(-server启用JDK的server模式,提升性能)。2. 优化非堆内存(方法区)参数
非堆内存主要用于存储类元数据、常量池等,需通过以下参数调整:
-XX:PermSize:设置非堆内存初始大小(如-XX:PermSize=128m),默认值为物理内存的1/64;-XX:MaxPermSize:设置非堆内存最大大小(如-XX:MaxPermSize=256m),默认值为物理内存的1/4。OutOfMemoryError: PermGen space错误。3. 选择合适的垃圾回收器并调优
垃圾回收(GC)是影响内存效率的关键环节,需根据应用特点选择合适的GC算法:
-XX:+UseSerialGC,但并发能力弱,不适合高负载场景;-XX:+UseParallelGC(年轻代)和-XX:+UseParallelOldGC(老年代);-XX:+UseG1GC,并可通过-XX:MaxGCPauseMillis设置最大GC停顿时间(如-XX:MaxGCPauseMillis=200)。jstat -gcutil <pid>或jvisualvm等工具监控GC频率和耗时,确保GC停顿时间不影响应用响应。4. 配置Tomcat线程池参数
线程池的配置直接影响内存使用和并发处理能力,需在conf/server.xml中调整Connector节点的参数:
maxThreads:设置最大线程数(如maxThreads="300"),表示Tomcat能同时处理的请求数量,需根据服务器CPU核心数和应用处理能力调整(建议为CPU核心数的2-4倍);minSpareThreads:设置最小空闲线程数(如minSpareThreads="50"),保持一定数量的空闲线程,避免频繁创建线程的开销;acceptCount:设置请求队列长度(如acceptCount="300"),当所有线程都在处理请求时,新请求会进入队列,队列满则拒绝请求。<Connector port="8080" protocol="HTTP/1.1" maxThreads="300" minSpareThreads="50" acceptCount="300" ... />。5. 禁用不必要的功能与优化连接器
conf/server.xml中将autoDeploy设置为false,避免Tomcat定期扫描应用目录导致的资源消耗;conf/catalina.properties中添加org.apache.catalina.startup.ContextConfig.jarsToSkip=*.jar,跳过JAR包中的TLD文件扫描,减少内存占用;protocol="org.apache.coyote.http11.Http11NioProtocol"),提升高并发下的性能;protocol="org.apache.coyote.http11.Http11Nio2Protocol"启用HTTP/2,减少协议开销,提升传输效率。6. 使用系统级资源限制
通过Linux系统工具限制Tomcat的内存使用,避免单个进程占用过多内存导致系统崩溃:
sudo cgcreate -g memory:/tomcat
echo "2G" | sudo tee /sys/fs/cgroup/memory/tomcat/memory.limit_in_bytes
echo <Tomcat_PID> | sudo tee /sys/fs/cgroup/memory/tomcat/tasks
/etc/systemd/system/tomcat.service),在[Service]部分添加MemoryMax=2G,然后执行systemctl daemon-reload和systemctl restart tomcat;ulimit -v限制虚拟内存大小(如ulimit -v 2000000,单位为KB),添加到Tomcat启动脚本(如startup.sh)中。注意事项
jconsole、VisualVM或Prometheus+Granafa),根据实际情况调整参数。