在 4GB 内存 的服务器(CentOS 或 Ubuntu)上运行 Spring Boot + MySQL,属于典型的轻量级生产/准生产或中高负载的开发测试环境。关键在于合理分配内存、避免 OOM、兼顾稳定性和响应性。以下是经过实践验证的最低可行且推荐的配置建议:
✅ 一、整体内存分配原则(总内存 ≈ 4GB = 4096MB)
| 组件 | 建议分配内存 | 说明 |
|---|---|---|
| MySQL | 1.2–1.6 GB | 确保 innodb_buffer_pool_size 占用主要部分(建议设为物理内存的 30–40%,即 1.2–1.6GB),避免 swap 频繁交换 |
| Spring Boot (JVM) | 1.2–1.5 GB | -Xms1200m -Xmx1500m(堆内存),预留 200–300MB 给 Metaspace、线程栈、直接内存等 |
| OS + 其他开销 | ≥ 800 MB | Linux 内核、SSH、日志、系统缓存、文件句柄、临时进程等(不可压缩的底线) |
⚠️ 严禁将 JVM 堆设为
-Xmx3g或 MySQL 设为2g+—— 极易触发 OOM Killer 杀死 MySQL 或 Java 进程。
✅ 二、MySQL 关键配置(/etc/my.cnf 或 /etc/mysql/my.cnf)
[mysqld]
# 必须调优项
innodb_buffer_pool_size = 1400M # 核心!占总内存 34% 左右,根据实际数据量微调(如 <1GB 数据可降至 1000M)
innodb_log_file_size = 128M # 提升写性能,避免频繁 checkpoint
innodb_flush_log_at_trx_commit = 1 # 生产环境保持 1(保证 ACID),若允许短暂丢失可设为 2(仅限非关键场景)
max_connections = 100 # 默认151过高,4GB机器100足够(Spring Boot连接池通常配 10–30)
table_open_cache = 400
sort_buffer_size = 256K
read_buffer_size = 128K
tmp_table_size = 32M
max_heap_table_size = 32M
# 安全与兼容
skip-host-cache
skip-name-resolve
bind-address = 127.0.0.1 # 如仅本地 Spring Boot 访问,禁用远程(提升安全+性能)
✅ 验证命令:
mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
mysql -e "SHOW STATUS LIKE 'Threads_connected';" # 监控连接数
✅ 三、Spring Boot JVM 启动参数(推荐使用 java -jar 方式)
java
-Xms1200m -Xmx1500m
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
-XX:+UseStringDeduplication
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=384m
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/myapp/heap.hprof
-Dfile.encoding=UTF-8
-jar /opt/myapp/app.jar
--spring.profiles.active=prod
📌 说明:
- 使用 G1 GC(JDK 8u202+/11+ 默认,适合 1.5G 堆);
MetaspaceSize控制类元数据内存,避免动态扩容抖动;- 禁止使用
-XX:+UseParallelGC或-XX:+UseConcMarkSweepGC(已废弃); - 若用 JDK 17+,可加
--enable-preview(按需)及-XX:+UseZGC(仅当低延迟强需求且确认兼容);
✅ 四、Spring Boot 应用层优化(application-prod.yml)
server:
port: 8080
compression:
enabled: true
mime-types: text/html,text/xml,text/plain,application/json
spring:
datasource:
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
hikari:
maximum-pool-size: 20 # ⚠️ 不要超过 MySQL max_connections * 0.7(即 ≤70),15–25 安全
minimum-idle: 5
connection-timeout: 30000
idle-timeout: 600000
max-lifetime: 1800000
validation-timeout: 3000
jpa:
hibernate:
ddl-auto: validate # 生产禁用 update/create
show-sql: false
properties:
hibernate:
format_sql: false
jdbc:
time_zone: Asia/Shanghai
# 日志精简(避免 I/O 压力)
logging:
level:
root: INFO
com.yourpackage: INFO
file:
name: /var/log/myapp/app.log
max-size: 10MB
max-history: 7
✅ 五、系统级调优(Linux)
-
关闭 Swap(强烈推荐)(避免 JVM/MySQL 被 swap 出去导致卡死):
sudo swapoff -a # 永久禁用:注释 /etc/fstab 中 swap 行 -
增大文件句柄限制(防止 Too many open files):
echo "* soft nofile 65536" | sudo tee -a /etc/security/limits.conf echo "* hard nofile 65536" | sudo tee -a /etc/security/limits.conf echo "fs.file-max = 2097152" | sudo tee -a /etc/sysctl.conf sudo sysctl -p -
时区 & 语言:
sudo timedatectl set-timezone Asia/Shanghai echo 'LANG=en_US.UTF-8' | sudo tee -a /etc/environment -
防火墙(UFW / firewalld):仅开放必要端口(8080, 3306 仅限 localhost):
# Ubuntu (UFW) sudo ufw allow OpenSSH sudo ufw allow 8080 sudo ufw enable
✅ 六、监控与告警(必备)
- ✅
htop/glances:实时内存/CPU/IO - ✅
mysqladmin processlist/SHOW PROCESSLIST;:查慢查询/阻塞 - ✅
jstat -gc <pid>:监控 JVM GC - ✅ 日志轮转:
logrotate配置 Spring Boot 和 MySQL 日志 - ✅ 可选轻量监控:
netdata(<50MB 内存)或Prometheus + Node Exporter + MySQL Exporter
❌ 避免的典型错误
| 错误做法 | 后果 |
|---|---|
MySQL innodb_buffer_pool_size = 2G + JVM -Xmx2G |
总内存超支 → OOM Killer 杀进程 |
Hikari 连接池 maximum-pool-size: 100 |
MySQL 连接耗尽、线程争抢、响应延迟飙升 |
| 未禁用 swap | JVM 大对象被 swap,GC STW 达数秒,请求超时 |
spring.jpa.hibernate.ddl-auto: update |
生产环境结构变更风险极高,且影响启动性能 |
未设置 server.compression.enabled=true |
文本响应体积大,带宽/延迟浪费 |
✅ 附:一键检查脚本(保存为 check-env.sh)
#!/bin/bash
echo "=== 内存总览 ==="
free -h
echo -e "n=== MySQL 缓冲池 ==="
mysql -Nse "SELECT @@innodb_buffer_pool_size/1024/1024;"
echo -e "n=== JVM 堆设置 ==="
ps aux | grep java | grep -v grep | grep -o 'Xmx[^ ]*'
echo -e "n=== 连接数 ==="
mysql -e "SHOW STATUS LIKE 'Threads_connected';"
echo -e "n=== 文件句柄 ==="
cat /proc/sys/fs/file-max
ulimit -n
如需进一步优化(如静态资源托管、HTTPS、反向X_X),可搭配 Nginx(内存占用 < 50MB);若业务增长,建议优先升级至 8GB 内存,而非强行堆参数。
需要我为你生成:
- 完整的
my.cnf示例文件? - systemd 服务文件(Spring Boot + MySQL 自启)?
- Docker Compose 轻量部署方案(含资源限制)?
欢迎随时提出 👍
云知识CLOUD