在仅有 2GB 内存的服务器上同时运行 Tomcat 和 MySQL,资源非常紧张。为了确保系统稳定、避免频繁的内存交换(swap)和 OOM(Out of Memory)错误,必须进行精细的内存优化。以下是针对 Tomcat 和 MySQL 的具体优化建议:
🔧 一、系统层面优化
1. 禁用不必要的服务
- 关闭不需要的服务(如 Apache、Redis、Nginx 等),只保留 Tomcat 和 MySQL。
- 使用
systemctl list-units --type=service --state=running查看正在运行的服务。
2. 合理配置 Swap
- 虽然 swap 会降低性能,但在内存不足时可防止崩溃。
- 建议设置 1–2GB 的 swap(例如使用
fallocate创建 swap 文件):sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile - 添加到
/etc/fstab永久生效。
3. 调整 swappiness
减少系统过早使用 swap:
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
🐘 二、MySQL 内存优化(重点)
目标:将 MySQL 内存控制在 800MB–1.2GB 左右。
编辑 MySQL 配置文件(通常是 /etc/mysql/my.cnf 或 /etc/my.cnf.d/server.cnf):
[mysqld]
# 基础设置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 内存相关关键参数
key_buffer_size = 32M # MyISAM 索引缓存(若主要用 InnoDB 可小)
max_allowed_packet = 16M
table_open_cache = 256 # 打开表缓存,避免过高
sort_buffer_size = 512K # 每连接排序缓冲
net_buffer_length = 8K
read_buffer_size = 256K # 每连接读取缓冲
read_rnd_buffer_size = 256K # 随机读缓冲
join_buffer_size = 256K # JOIN 缓冲(不要设太大)
# InnoDB 核心参数(重点)
innodb_buffer_pool_size = 512M # 最重要!缓存数据和索引(占总内存 40-50%)
innodb_log_file_size = 64M # 日志文件大小(可适当调小)
innodb_log_buffer_size = 8M # 日志缓冲
innodb_flush_log_at_trx_commit = 2 # 提高性能,牺牲一点持久性
innodb_file_per_table = 1
# 连接相关
max_connections = 50 # 控制最大连接数(默认151太高)
thread_cache_size = 8
query_cache_type = 0 # 禁用查询缓存(MySQL 8+ 已移除,5.7 可禁用)
query_cache_size = 0
# 其他
tmp_table_size = 32M
max_heap_table_size = 32M
✅ 说明:
innodb_buffer_pool_size = 512M是关键,太大可能导致系统内存耗尽。- 若应用并发不高,
max_connections = 50足够。- 禁用 query cache(反而可能造成锁争用)。
☕ 三、Tomcat 内存优化
目标:JVM 堆内存控制在 768MB–1024MB
1. 设置 JVM 参数(通过 setenv.sh)
在 $CATALINA_HOME/bin/setenv.sh 中添加:
export JAVA_OPTS="-server
-Xms512m
-Xmx768m
-XX:MetaspaceSize=96m
-XX:MaxMetaspaceSize=128m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+DisableExplicitGC
-Djava.awt.headless=true
-Dfile.encoding=UTF-8"
✅ 解释:
-Xms512m -Xmx768m:初始堆 512MB,最大 768MB,避免频繁扩容。- 使用 G1GC 垃圾回收器,适合中等堆内存。
- Metaspace 控制类元数据内存,避免无限增长。
- 显式 GC 禁用(某些框架会触发,影响性能)。
2. 优化 web 应用本身
- 减少静态资源加载,压缩 JS/CSS。
- 避免在内存中缓存大量数据(如用 Redis 外部缓存)。
- 及时关闭数据库连接、流等资源。
- 使用连接池(如 HikariCP),并限制最大连接数(如 10–20)。
📊 四、监控与调优
1. 实时监控内存使用
free -h
top
htop
2. 查看 Tomcat 和 MySQL 内存占用
ps aux | grep tomcat
ps aux | grep mysql
3. 使用 jstat 监控 JVM
jstat -gc <tomcat_pid> 1s
🎯 五、推荐资源配置总结(2G 内存)
| 组件 | 内存分配 | 说明 |
|---|---|---|
| MySQL | 800 – 1024 MB | 主要用于 innodb_buffer_pool |
| Tomcat (JVM) | 768 – 1024 MB | 堆 + Metaspace + Native |
| 系统及其他 | ~300 – 500 MB | OS、Swap、临时缓冲等 |
⚠️ 总内存使用应控制在 1.8GB 以内,避免频繁 swap。
✅ 六、额外建议
- 升级硬件:长期来看,建议升级到至少 4GB 内存。
- 分离服务:若流量较大,建议将 MySQL 和 Tomcat 部署在不同服务器。
- 使用轻量级替代:
- 用 MariaDB 替代 MySQL(更省内存)。
- 用 Undertow 或 Jetty 替代 Tomcat(更轻量)。
- 定期清理日志:防止日志文件占用过多磁盘和内存。
通过以上优化,可以在 2GB 内存服务器上较为稳定地运行 Tomcat + MySQL,适用于低并发、中小型应用或测试环境。关键是 合理分配内存、禁用冗余功能、持续监控。
秒懂云