在仅有 2GB 内存的服务器上运行 Tomcat 和 MySQL,需要对两个服务进行合理的内存配置和优化,以避免内存溢出(OOM)或频繁使用 Swap 导致性能下降。以下是具体的优化建议:
一、总体原则
- 预留系统内存:操作系统和基础服务至少保留 512MB。
- 合理分配剩余内存:
- Tomcat:建议分配 512MB ~ 768MB
- MySQL:建议分配 512MB ~ 768MB
总计:512 (OS) + 768 (Tomcat) + 768 (MySQL) ≈ 2048MB,需严格控制。
二、Tomcat 内存优化
1. 设置 JVM 堆内存大小
编辑 bin/catalina.sh(Linux)或 catalina.bat(Windows),添加如下 JVM 参数:
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 垃圾回收器,适合中等堆内存
如果应用较轻量,可设为
-Xmx384m以腾出更多内存给 MySQL。
2. 避免内存泄漏
- 定期检查日志中的
OutOfMemoryError - 使用
jstat或VisualVM监控 GC 情况 - 确保 Web 应用无静态集合缓存大量数据
3. 减少线程数(可选)
在 conf/server.xml 中调整连接器线程池:
<Connector port="8080" protocol="HTTP/1.1"
maxThreads="100"
minSpareThreads="10"
maxSpareThreads="50"
acceptCount="100"
connectionTimeout="20000"/>
减少 maxThreads 可降低内存消耗。
三、MySQL 内存优化
编辑 /etc/mysql/my.cnf 或 /etc/my.cnf,在 [mysqld] 段设置:
[mysqld]
# 基础设置
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# 关键内存参数(总内存控制在 512M~768M)
innodb_buffer_pool_size = 256M # 最重要!通常设为物理内存的 25%~40%
key_buffer_size = 64M # MyISAM 索引缓存,若不用 MyISAM 可更小
query_cache_type = 0 # 禁用查询缓存(MySQL 5.7+ 已废弃,但可显式关闭)
query_cache_size = 0
tmp_table_size = 32M
max_heap_table_size = 32M
sort_buffer_size = 512K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
join_buffer_size = 512K
thread_stack = 192K
binlog_cache_size = 32K
# 连接相关
max_connections = 50 # 根据实际需求,避免过高
table_open_cache = 256
thread_cache_size = 8
# 日志与安全
log-error=/var/log/mysqld.log
slow_query_log = 1
long_query_time = 2
⚠️
innodb_buffer_pool_size是最关键的参数,不应超过 512M,推荐 256M~384M。
四、系统级优化
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. 监控内存使用
使用以下命令监控:
free -h
top
htop
journalctl -u mysql
tail -f /var/log/tomcat/catalina.out
3. 关闭不必要的服务
禁用不使用的服务(如 Apache、Postfix、Bluetooth 等):
sudo systemctl disable apache2 bluetooth
五、其他建议
- 使用轻量级 OS:如 Alpine Linux、Ubuntu Server Minimal
- 定期重启服务:防止内存缓慢增长(尤其 Java 应用)
- 使用 Nginx 替代 Tomcat 静态资源处理
- 将静态文件交给 Nginx 处理,减轻 Tomcat 负担
- 考虑分离部署(长期方案)
- 将 Tomcat 和 MySQL 部署在不同机器,或升级到 4GB+
六、示例资源配置汇总(2GB 总内存)
| 组件 | 内存分配 | 说明 |
|---|---|---|
| 操作系统 & 基础服务 | 512MB | 包括 SSH、cron、日志等 |
| Tomcat (JVM) | 512MB | -Xmx512m |
| MySQL | 512MB | 主要是 innodb_buffer_pool |
| 留空 / Swap 缓冲 | 412MB | 用于临时峰值或 Swap |
实际使用中尽量保持内存使用 < 1.6GB,避免触发 Swap。
结语
在 2GB 内存环境下运行 Tomcat + MySQL 是可行的,但必须精细调优。重点在于:
- 控制 JVM 堆大小
- 合理设置 MySQL 缓冲池
- 监控并预防内存泄漏
- 必要时启用 Swap 作为保险
如果业务增长,建议尽早升级硬件或拆分服务。
CLOUD云枢