在2GB内存的服务器上同时运行Tomcat和MySQL,资源较为紧张,需要精细配置以避免内存溢出(OOM)或系统频繁使用Swap导致性能下降。以下是针对Tomcat和MySQL的内存优化建议:
一、整体策略
- 合理分配内存:建议分配:
- MySQL:800MB ~ 1GB
- Tomcat (JVM):700MB ~ 900MB
- 系统及其他进程:剩余内存(约300~500MB)
- 避免两者同时占用过多内存,防止Swap。
二、MySQL 内存优化
编辑 MySQL 配置文件(通常是 /etc/mysql/my.cnf 或 /etc/my.cnf),设置以下关键参数:
[mysqld]
# 基础设置
port = 3306
skip-name-resolve # 跳过DNS解析,提升连接速度
max_connections = 50 # 减少连接数,避免内存耗尽
# 缓冲区设置(重点)
key_buffer_size = 16M # MyISAM索引缓存,小站点可设低
innodb_buffer_pool_size = 512M # InnoDB核心缓存,占总内存的50%左右
innodb_log_file_size = 64M # 日志文件大小,适中即可
innodb_log_buffer_size = 8M # 日志缓冲,减少磁盘IO
query_cache_type = 0 # 关闭查询缓存(MySQL 5.7+ 已弃用,但可显式关闭)
query_cache_size = 0
tmp_table_size = 32M
max_heap_table_size = 32M # 防止内存表过大
thread_cache_size = 8 # 线程缓存,避免频繁创建线程
# 连接与超时
wait_timeout = 60
interactive_timeout = 60
✅ 推荐:如果主要使用InnoDB引擎,
innodb_buffer_pool_size是最关键的参数,建议设置为512M~768M。
三、Tomcat JVM 内存优化
修改 catalina.sh 或 setenv.sh,设置JVM启动参数:
export JAVA_OPTS="-server
-Xms512m
-Xmx768m
-XX:MetaspaceSize=64m
-XX:MaxMetaspaceSize=128m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/var/log/tomcat/heapdump.hprof
-Djava.awt.headless=true"
参数说明:
-Xms512m: 初始堆大小,避免频繁扩容-Xmx768m: 最大堆大小,控制上限-XX:MetaspaceSize和MaxMetaspaceSize: 控制元空间(替代永久代),防止类加载过多导致OOM-UseG1GC: 使用G1垃圾回收器,适合中小堆且停顿时间敏感-HeapDumpOnOutOfMemoryError: OOM时生成堆转储,便于排查
⚠️ 注意:不要设置
-Xmn(新生代)过大,G1会自动管理;若使用CMS,请根据情况调整。
四、系统级优化
-
禁用不必要的服务
sudo systemctl disable bluetooth avahi-daemon snapd # 示例 -
限制Swap使用
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf sudo sysctl -p设置
swappiness=10表示仅在真正需要时才使用Swap。 -
监控内存使用
安装htop、glances或nmon实时查看内存、CPU使用情况。htop free -h
五、应用层面优化
- 减少部署应用数量:避免在Tomcat中部署多个大型Web应用。
- 启用压缩:在
server.xml中开启HTTP压缩,减少响应体积。 - 静态资源分离:将图片、CSS、JS交给Nginx/Apache处理,减轻Tomcat压力。
- 数据库连接池优化(如使用HikariCP):
maximumPoolSize=20 minimumIdle=5 connectionTimeout=30000 maxLifetime=1800000
六、可选方案:使用反向X_X + 静态资源分离
推荐架构:
用户 → Nginx(静态资源 + 反向X_X) → Tomcat(仅动态请求)
↘ MySQL
- Nginx 占用内存极小(通常 < 50MB)
- 静态资源由Nginx直接返回,不经过Tomcat
七、监控与调优建议
-
启动后观察内存使用:
free -h ps aux --sort=-%mem | head -10 -
查看Tomcat GC日志(可添加):
-Xloggc:/var/log/tomcat/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -
根据实际负载逐步微调内存参数。
总结:推荐配置汇总
| 组件 | 推荐内存分配 |
|---|---|
| MySQL | ~768MB |
| Tomcat | ~768MB |
| 系统/其他 | ~512MB |
🔄 提示:没有“万能配置”,需根据实际应用负载动态调整。先保守设置,再逐步优化。
通过以上优化,可以在2G内存服务器上稳定运行中小型Java Web应用(如博客、后台管理系统等)。若流量增长,建议升级内存或拆分服务。
CDNK博客