Ubuntu中Tomcat内存配置技巧
Tomcat在Ubuntu中的内存配置主要通过修改启动脚本实现,不同系统版本对应不同文件:
/etc/default/tomcat6(Tomcat 6)或/etc/default/tomcat7(Tomcat 7),找到JAVA_OPTS参数进行调整。setenv.sh文件(位于$CATALINA_HOME/bin/目录下),或在/lib/systemd/system/tomcat.service中修改Environment参数(需通过systemctl daemon-reload生效)。$CATALINA_HOME/bin/catalina.sh(Tomcat安装根目录下的bin目录),在文件开头添加JAVA_OPTS参数(适用于所有系统版本)。内存配置的核心参数需根据应用场景调整,以下是常用参数及其作用:
-Xms:JVM初始堆内存大小(如-Xms512m表示初始分配512MB),建议与-Xmx设置为相同值,避免堆内存频繁扩容导致的性能损耗。-Xmx:JVM最大堆内存大小(如-Xmx2048m表示最大允许使用2GB),需根据服务器物理内存调整(一般不超过物理内存的80%,避免系统或其他进程无内存可用)。-XX:PermSize/-XX:MaxPermSize(Java 7及更早):永久代初始大小和最大大小(如-XX:PermSize=128m -XX:MaxPermSize=256m),用于存储Class元数据,若应用有大量第三方JAR包,需适当增大此值(Java 8及以上替换为-XX:MetaspaceSize和-XX:MaxMetaspaceSize)。-XX:NewRatio:年轻代与老年代的比例(如-XX:NewRatio=4表示年轻代占堆内存的1/5),适用于需要频繁创建短期对象的场景(如Web应用)。-XX:MaxTenuringThreshold:对象在年轻代中存活的最大年龄(如-XX:MaxTenuringThreshold=20),调整此值可控制对象晋升老年代的时机,减少Full GC次数。小型应用(物理内存≤2GB):
适用于测试环境或轻量级应用,配置示例如下(以Tomcat 9为例):
export JAVA_OPTS="-server -Xms512m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=256m -XX:+UseParNewGC -XX:+UseConcMarkSweepGC"
说明:初始堆512MB,最大堆1GB,年轻代使用ParNewGC(并行收集),老年代使用CMS(并发标记清除),平衡性能与资源占用。
中型应用(物理内存2-8GB):
适用于生产环境中的常规应用,推荐使用G1GC(Garbage-First Garbage Collector),提升大内存下的GC效率:
export JAVA_OPTS="-server -Xms1024m -Xmx2048m -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
说明:初始堆与最大堆均设为1GB和2GB(避免扩容),元空间设为256MB-512MB(适应更多Class元数据),G1GC的目标最大GC停顿时间为200ms,适合对延迟敏感的场景。
大型应用(物理内存≥8GB):
适用于高并发、大数据量的生产环境,需进一步优化堆内存分配:
export JAVA_OPTS="-server -Xms4096m -Xmx8192m -XX:NewRatio=3 -XX:SurvivorRatio=8 -XX:+UseG1GC -XX:InitiatingHeapOccupancyPercent=70"
说明:初始堆与最大堆设为4GB和8GB(占物理内存的50%-80%),年轻代与老年代比例为1:3(-XX:NewRatio=3),Eden区与Survivor区比例为8:1:1(-XX:SurvivorRatio=8),G1GC的堆占用阈值设为70%(-XX:InitiatingHeapOccupancyPercent=70),提前触发GC避免Full GC停顿过长。
避免内存溢出:
若应用出现java.lang.OutOfMemoryError: Java heap space,需增大-Xmx值;若出现java.lang.OutOfMemoryError: PermGen space(Java 7及更早)或Metaspace错误,需增大对应的元空间参数。可通过Tomcat日志(catalina.out)或JDK工具(如jmap、jvisualvm)分析内存使用情况。
统一初始与最大堆内存:
将-Xms与-Xmx设置为相同值(如-Xms2048m -Xmx2048m),避免JVM在运行时频繁申请/释放内存,提升性能稳定性。
选择合适的GC算法:
-XX:+UseParNewGC(年轻代并行)+-XX:+UseConcMarkSweepGC(老年代并发),适合多核CPU环境。-XX:+UseG1GC(Garbage-First),针对大内存场景优化,减少Full GC次数。调整线程池参数:
内存配置需与线程池配合,避免线程过多导致内存耗尽。编辑server.xml中的Connector配置,调整maxThreads(最大线程数,如200)、minSpareThreads(最小空闲线程数,如50)、acceptCount(等待队列长度,如100),根据服务器CPU核心数(如4核)和预期并发量设置。
监控与动态调整:
使用工具(如JConsole、VisualVM、Prometheus+Granafa)实时监控Tomcat内存使用情况(堆内存、元空间、GC频率),根据监控数据动态调整参数(如增大-Xmx或优化GC算法),确保应用稳定运行。