在仅有 2GB 内存的服务器上同时运行 Tomcat 和 MySQL,资源非常紧张,必须进行精细的内存优化。以下是针对 Tomcat 和 MySQL 的具体调优建议,以确保系统稳定运行。
🔧 一、总体策略
- 避免内存溢出(OOM)
- 合理分配内存给两个服务
- 关闭不必要的服务和进程
- 监控内存使用情况
建议分配:
- MySQL:800MB ~ 1GB
- Tomcat(JVM):768MB ~ 1GB
- 操作系统和其他进程:剩余部分(约 256~512MB)
🐬 二、MySQL 内存优化(my.cnf 配置)
编辑 /etc/mysql/my.cnf 或 /etc/my.cnf,调整以下参数:
[mysqld]
# 基础设置
skip-name-resolve # 禁用DNS解析,加快连接
skip-networking=0 # 如果需要远程访问则开启
innodb_buffer_pool_size = 512M # 核心!缓存表和索引,建议设为物理内存的 25%~40%
innodb_log_file_size = 64M # 日志文件大小,不宜过大
innodb_log_buffer_size = 8M # 日志缓冲区
max_connections = 50 # 限制最大连接数(默认151太高)
table_open_cache = 200 # 打开表的缓存
tmp_table_size = 32M # 内存临时表上限
max_heap_table_size = 32M # 内存中HEAP表的最大大小
key_buffer_size = 32M # MyISAM索引缓存(如果不用MyISAM可更小)
query_cache_type = 0 # 禁用查询缓存(MySQL 5.7+已过时且有锁竞争)
performance_schema = OFF # 关闭性能监控(节省几十MB)
✅ 建议:如果只使用 InnoDB,可以禁用 MyISAM 相关组件。
检查当前内存使用
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
☕ 三、Tomcat JVM 内存优化(setenv.sh)
创建或修改 tomcat/bin/setenv.sh 文件:
#!/bin/bash
export JAVA_OPTS="-server
-Xms256m
-Xmx768m
-XX:MetaspaceSize=64m
-XX:MaxMetaspaceSize=128m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-Djava.awt.headless=true
-Dfile.encoding=UTF-8"
参数说明:
-Xms256m:JVM 启动时分配最小堆内存-Xmx768m:JVM 最大堆内存(不要超过 1G)-XX:MetaspaceSize:元空间控制类加载内存-XX:+UseG1GC:使用 G1 垃圾回收器,适合低延迟- 避免使用 CMS(已废弃),推荐 G1
✅ 提示:应用本身也应优化,避免内存泄漏。
🖥️ 四、系统级优化
1. 关闭不必要的服务
sudo systemctl stop apache2 # 如果没用
sudo systemctl disable snapd # Snap 占用资源
sudo systemctl disable bluetooth # 如果不需要
2. 添加 Swap 分区(重要!)
2G 内存容易爆,建议添加 1~2GB swap:
# 创建 2GB swap 文件
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效,写入 /etc/fstab
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
调整 swappiness(减少对 swap 的依赖):
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
📊 五、监控与诊断工具
实时监控命令:
htop # 查看进程内存占用
free -h # 查看内存和 swap 使用
df -h # 检查磁盘空间
journalctl -u mysql # 查看 MySQL 日志
tail -f tomcat/logs/catalina.out # 查看 Tomcat 日志
安装轻量监控:
sudo apt install htop iotop
🚫 六、其他建议
- 不要在同一台机器部署 Redis/Nginx 等额外服务,除非必要。
- 定期重启服务,防止内存缓慢增长。
- 使用 Nginx 反向X_X静态资源,减轻 Tomcat 负担(可选)。
- 数据库表要加索引,避免全表扫描导致内存飙升。
- 应用层面优化:减少大结果集查询,分页处理数据。
✅ 总结:关键配置速查
| 组件 | 推荐配置值 |
|---|---|
| MySQL | innodb_buffer_pool_size = 512M |
| Max Connections | max_connections = 50 |
| Tomcat Heap | -Xmx768m |
| JVM GC | -XX:+UseG1GC |
| Swap | 至少 1~2GB |
| Swappiness | vm.swappiness=10 |
通过以上优化,2G 内存服务器可以较稳定地运行小型业务的 Tomcat + MySQL 应用。但若流量增长,建议尽快升级到 4GB 或以上内存,或拆分服务部署。
云计算HECS