在仅有2GB内存的服务器上同时运行Tomcat和MySQL,资源非常紧张。如果不进行合理优化,很容易出现内存耗尽、系统频繁使用Swap导致性能急剧下降,甚至服务崩溃。以下是针对 Tomcat + MySQL 在 2G 内存服务器上的内存优化建议:
🧩 一、总体资源分配建议(推荐)
| 服务 | 建议最大内存占用 |
|---|---|
| MySQL | 800MB ~ 1GB |
| Tomcat | 512MB ~ 768MB |
| 系统+其他 | 256MB ~ 512MB |
⚠️ 总内存使用控制在 1.5GB 以内,为系统缓存和突发情况留出缓冲。
🔧 二、MySQL 内存优化
编辑 MySQL 配置文件(通常是 /etc/mysql/my.cnf 或 /etc/my.cnf):
[mysqld]
# 基础设置
skip-innodb # 如果不用InnoDB可关闭(不推荐生产环境)
# 或者优化 InnoDB
innodb_buffer_pool_size = 256M # 核心:缓存表和索引,建议设为总内存的 25%~30%
innodb_log_file_size = 64M
innodb_log_buffer_size = 4M
# 连接相关
max_connections = 50 # 减少并发连接数(默认151太高)
thread_cache_size = 4
table_open_cache = 64 # 减小打开表缓存
table_definition_cache = 400
# 查询缓存(MySQL 5.7 及以下)
query_cache_type = 1
query_cache_size = 32M # 不要太大,避免锁争用
# 临时表
tmp_table_size = 32M
max_heap_table_size = 32M
# 关闭不必要的功能
skip_name_resolve # 避免DNS反查,提升连接速度
key_buffer_size = 32M # MyISAM索引缓存,若无MyISAM可更小
✅ 重点调优参数:
innodb_buffer_pool_size:最关键,不要超过 512M(2G 机器建议 256M~384M)max_connections:限制连接数防止内存爆炸tmp_table_size/max_heap_table_size:防止大临时表占满内存
📌 提示:使用 MySQLTuner 工具分析当前配置合理性。
☕ 三、Tomcat 内存优化
1. 设置 JVM 内存参数
修改 catalina.sh(Linux)或 setenv.sh,添加:
export JAVA_OPTS="-Xms256m -Xmx512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC"
解释:
-Xms256m:JVM 初始堆内存-Xmx512m:最大堆内存(关键!不能过大)-XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m:元空间限制(替代永久代)-XX:+UseG1GC:使用 G1 垃圾回收器,适合低暂停需求
❗ 避免使用
-Xss过小值,可能导致线程栈溢出。
2. 优化 Tomcat 自身配置
在 conf/server.xml 中调整线程池:
<Executor name="tomcatThreadPool"
namePrefix="http-thread-"
maxThreads="100"
minSpareThreads="10"
maxIdleTime="60000" />
连接器使用线程池并限制并发:
<Connector executor="tomcatThreadPool"
port="8080"
protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
3. 应用层面优化
- 避免内存泄漏:检查 Session 是否过期、静态集合是否无限增长
- 减少 WAR 包大小,移除无用依赖
- 使用轻量级框架(如 Spring Boot 默认较重,注意裁剪)
🛠 四、系统级优化
1. 启用 Swap(必要时)
虽然 Swap 会降低性能,但在内存不足时能防止 OOM Kill。
# 创建 1GB Swap 文件
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
添加到 /etc/fstab 永久生效:
/swapfile none swap sw 0 0
2. 调整 Swappiness
减少系统过早使用 Swap:
echo 'vm.swappiness=10' >> /etc/sysctl.conf
sysctl -p
值范围 0~100,10 表示尽量用物理内存。
3. 监控工具
安装监控工具观察内存使用:
htop # 实时查看进程内存
free -h # 查看内存和 swap 使用
df -h # 查看磁盘(包括 swap)
journalctl -u mysql --since "1 hour ago" # 查看 MySQL 日志
✅ 五、其他建议
- 不要在同一台机器部署 Redis/Nginx 等额外服务,除非极轻量。
- 使用 Nginx 代替 Tomcat 处理静态资源(JS/CSS/图片),减轻 Tomcat 负担。
- 定期重启 Tomcat 和 MySQL,避免长期运行内存碎片或缓慢泄漏。
- 使用轻量 Linux 发行版(如 Alpine、Ubuntu Server 最小安装)。
📊 六、验证优化效果
运行一段时间后,检查:
free -h:剩余可用内存是否稳定ps aux | grep mysql:MySQL 实际内存使用jstat -gc <tomcat_pid>:查看 JVM GC 情况- 日志中是否有
OutOfMemoryError或MySQL server has gone away
总结
| 项目 | 推荐配置 |
|---|---|
| MySQL 内存 | ≤ 512M ~ 768M |
| Tomcat JVM (-Xmx) | 512M |
| Swap | 1GB(强烈建议) |
| 系统监控 | htop, free, journalctl |
| 关键参数 | innodb_buffer_pool_size, -Xmx |
💡 最终目标:确保系统在高负载下也不频繁使用 Swap,避免 OOM。
如果你的应用访问量较大,建议尽早考虑升级服务器至 4GB 内存,或拆分服务(MySQL 单独部署)。2G 服务器仅适合低并发测试或轻量级应用。
轻量云Cloud