在只有 2GB 内存的服务器上同时运行 Tomcat 和 MySQL,资源较为紧张,需要合理分配内存以避免频繁的内存交换(swap)导致性能下降。以下是针对 Tomcat 和 MySQL 的内存优化建议:
一、总体原则
- 总内存分配:2GB 内存中,建议:
- 操作系统保留:512MB
- Tomcat 使用:768MB ~ 1GB
- MySQL 使用:512MB ~ 768MB
- 避免 swap 使用,确保服务稳定。
- 关闭不必要的系统服务(如蓝牙、打印等),释放内存。
二、MySQL 内存优化(my.cnf)
编辑 /etc/mysql/my.cnf 或 /etc/my.cnf,配置如下(适用于小内存环境):
[mysqld]
# 基础设置
port = 3306
socket = /var/run/mysqld/mysqld.sock
skip-name-resolve # 禁用 DNS 解析,提升连接速度
max_connections = 50 # 最大连接数,避免过多连接耗尽内存
# 缓冲区设置(关键)
key_buffer_size = 16M # MyISAM 索引缓存,若不用 MyISAM 可更小
innodb_buffer_pool_size = 256M # InnoDB 缓存,最重要!设为可用内存的 50%~70%
innodb_log_file_size = 64M
innodb_log_buffer_size = 4M
query_cache_type = 0 # 禁用查询缓存(MySQL 8.0+ 已移除,5.7 可关闭)
query_cache_size = 0 # 节省内存并避免锁争用
# 连接与线程
thread_cache_size = 4
table_open_cache = 64
tmp_table_size = 32M
max_heap_table_size = 32M
# 日志与安全
log-error = /var/log/mysql/error.log
slow_query_log = 0 # 关闭慢查询日志除非调试需要
📌 重点:
innodb_buffer_pool_size = 256M是最关键的配置,不应超过物理内存的 70%。
三、Tomcat 内存优化(setenv.sh)
在 Tomcat 的 bin/ 目录下创建或修改 setenv.sh 文件:
#!/bin/bash
export JAVA_OPTS="-server -Xms512m -Xmx768m
-XX:MetaspaceSize=64m
-XX:MaxMetaspaceSize=128m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-Djava.awt.headless=true
-Dfile.encoding=UTF-8"
参数说明:
-Xms512m:JVM 初始堆大小-Xmx768m:最大堆大小(不超过 1GB)-XX:MetaspaceSize:元空间大小,替代永久代-XX:+UseG1GC:使用 G1 垃圾回收器,适合低延迟场景- 避免使用 CMS(已弃用),G1 更适合小堆
✅ 注意:如果你部署的应用较轻(如一个简单 Web 应用),可将
-Xmx设为 512m。
四、操作系统层面优化
-
关闭 swap 或限制使用
sudo swapoff -a # 临时关闭小内存服务器应尽量避免 swap,否则响应变慢。
-
监控内存使用
free -h top htop -
精简服务
- 关闭 Apache/Nginx(如果只用 Tomcat 内置 Servlet 容器)
- 关闭邮件、cron 外的非必要服务
-
使用轻量级 OS
- 推荐使用 Ubuntu Server LTS、Alpine Linux 等轻量发行版
五、应用层优化建议
- 减少部署 WAR 包数量:只运行必要的应用。
- 启用 Tomcat 的压缩
在server.xml中配置:<Connector ... compression="on" compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"/> - 静态资源交给 CDN 或 Nginx(如有条件)
- 数据库连接池调优(如 HikariCP):
maximumPoolSize=20
六、验证与监控
- 启动后检查各服务内存占用:
ps aux | grep mysql ps aux | grep tomcat - 使用
jstat查看 JVM GC 情况:jstat -gc <tomcat_pid> 1s
总结:推荐内存分配方案
| 组件 | 内存分配 | 说明 |
|---|---|---|
| 操作系统 | 512MB | 基础运行 |
| MySQL | 512–768MB | 主要用于 innodb_buffer_pool_size |
| Tomcat (JVM) | 512–768MB | 根据应用复杂度调整 |
| 留余缓冲 | 128–256MB | 防止 OOM |
✅ 最终建议:
如果业务增长,建议尽早升级到 4GB 内存以上,或拆分数据库和应用服务器。2GB 环境仅适合轻量级测试或低并发生产场景。
如有具体应用类型(如 Spring Boot、WordPress 等),可进一步针对性优化。
CLOUD技术博