在 2GB 内存的云服务器上同时运行 Tomcat 和 MySQL,资源非常紧张,必须精细调优以避免 OOM(Out Of Memory)。以下是关键优化策略:
一、Tomcat 优化配置
1. JVM 内存设置
# /usr/local/tomcat/bin/setenv.sh (推荐) 或 CATALINA_OPTS
export CATALINA_OPTS="-Xms512m -Xmx768m -XX:MaxMetaspaceSize=128m -XX:+UseG1GC"
- 堆内存:
-Xmx设为 768MB(预留空间给其他进程) - 元空间:限制 Metaspace 防止类加载泄漏
- 垃圾回收器:使用 G1GC 更适合小内存场景
2. Tomcat 自身配置
<!-- server.xml -->
<Connector port="8080"
maxThreads="100"
minSpareThreads="10"
connectionTimeout="20000"
URIEncoding="UTF-8" />
<!-- catalina.properties -->
org.apache.catalina.core.StandardContext.classLoaderDefaultHost=true
- 降低
maxThreads避免线程过多消耗内存 - 禁用不必要的 Valve 和 Manager 应用
二、MySQL 优化配置
1. 核心参数调整(my.cnf)
[mysqld]
# 内存分配(总内存2GB,MySQL最多占600-700MB)
innodb_buffer_pool_size = 400M
key_buffer_size = 32M
max_connections = 50
# 查询缓存(MySQL 8.0+ 已移除,旧版本谨慎使用)
query_cache_type = 0
query_cache_size = 0
# 临时表限制
tmp_table_size = 32M
max_heap_table_size = 32M
# 连接相关
thread_cache_size = 10
table_open_cache = 200
# InnoDB 日志
innodb_log_file_size = 64M
innodb_flush_log_at_trx_commit = 2
# 性能优化
skip-name-resolve
local-infile = 0
performance_schema = OFF
2. 关键原则
- innodb_buffer_pool_size:设为物理内存的 40-50%(约400-500MB)
- max_connections:控制在 50 以内,避免连接数过多
- 关闭不必要功能:如 query_cache、performance_schema
三、系统级优化
1. 交换空间配置
# 创建 2GB swap 分区
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
- 设置 vm.swappiness=10 减少 swap 使用频率
sudo sysctl vm.swappiness=10
2. 监控与告警
# 安装监控工具
apt install htop iotop net-tools
# 定期检查内存使用
free -h
vmstat 1 5
四、应用层优化建议
-
代码层面:
- 避免大对象一次性加载
- 使用流式处理大数据集
- 及时关闭数据库连接和文件句柄
-
架构优化:
- 考虑将静态资源分离到 CDN
- 实现读写分离减轻主库压力
- 添加 Redis 缓存热点数据
-
部署策略:
- 启用 Tomcat 的 session 共享(Redis存储)
- 定期清理临时文件和日志
- 使用轻量级框架替代重型应用
五、验证与测试
# 检查实际内存使用
ps aux | grep -E 'java|mysql' | awk '{print $6}' | sort -n
# 压测前准备
jmap -heap <pid> # 查看JVM堆信息
mysqladmin variables | grep -E 'buffer|cache'
重要提醒:
- 首次调整后密切观察 24-48 小时
- 生产环境先在小流量时段测试
- 保留回滚方案,确保业务连续性
- 考虑升级服务器配置作为长期解决方案
通过以上组合优化,2GB 内存服务器可以稳定运行 Tomcat + MySQL 的基础应用场景。如果业务增长,建议逐步迁移到更高配置或使用容器化部署。
云知道CLOUD