在Tomcat中部署Java应用时,JVM内存分配需要根据应用需求、服务器资源和并发情况综合考虑。以下是具体建议:
一、基础配置原则
1. 初始配置(起点)
# 生产环境最小配置
-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m
# 中等规模应用
-Xms2g -Xmx4g -XX:MaxMetaspaceSize=512m
2. 关键参数说明
- -Xms:初始堆大小(建议与-Xmx相同,避免运行时调整)
- -Xmx:最大堆大小
- -XX:MaxMetaspaceSize:元空间最大值(替代PermGen)
- -Xss:线程栈大小(默认1MB,可适当降低)
二、配置建议(按应用规模)
1. 小型应用/测试环境
- 用户量:< 100并发
- 内存:2-4GB服务器
JAVA_OPTS="-Xms512m -Xmx1024m -XX:MaxMetaspaceSize=256m"
2. 中型应用
- 用户量:100-1000并发
- 内存:8-16GB服务器
JAVA_OPTS="-Xms2g -Xmx4g -XX:MaxMetaspaceSize=512m"
3. 大型应用
- 用户量:> 1000并发
- 内存:16GB+服务器
JAVA_OPTS="-Xms4g -Xmx8g -XX:MaxMetaspaceSize=1g"
三、配置位置
1. Linux(catalina.sh)
# 在catalina.sh开头添加
export JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC"
2. Windows(catalina.bat)
set JAVA_OPTS=-Xms2g -Xmx4g -XX:+UseG1GC
3. systemd服务(推荐)
[Service]
Environment="JAVA_OPTS=-Xms2g -Xmx4g -XX:+UseG1GC"
四、优化建议
1. 监控与调整
# 监控命令
jstat -gc <pid> 1000 # GC统计
jmap -heap <pid> # 堆内存分析
2. GC策略选择
# G1 GC(JDK 9+默认)
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
# CMS GC(JDK 8)
-XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled
3. 避免的配置
# 不要超过物理内存的70%
# 不要设置-Xmn(年轻代)过大
# 避免PermGen配置(JDK 8+使用Metaspace)
五、检查清单
- 堆外内存:考虑NIO、线程栈、JNI等
- 线程数:
maxThreads(默认200) ×-Xss - 系统保留:为OS和其他进程留出内存
- 监控工具:配置JMX或Prometheus监控
六、示例配置
生产环境典型配置(8GB服务器):
JAVA_OPTS="
-server
-Xms3g -Xmx6g
-XX:MaxMetaspaceSize=512m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/tomcat/logs/heapdump.hprof
-Djava.security.egd=file:/dev/./urandom
"
关键提示:通过监控GC日志和性能指标,持续优化配置:
-XX:+PrintGCDetails -Xloggc:/opt/tomcat/logs/gc.log
建议先从小配置开始,根据实际监控数据逐步调整,避免一次性分配过大内存。
CLOUD技术笔记