若依(RuoYi)框架基于 Spring Boot 构建,配合 MySQL 和 Redis 部署时,内存分配的核心原则是根据服务器总内存、业务负载类型以及组件的默认配置进行动态调整。没有一套“万能”的固定数值,但有一套通用的分配策略和关键参数。
以下是针对不同部署场景的内存分配建议及关键配置项分析:
1. 核心组件内存角色分析
在分配前,需明确各组件在内存中的主要消耗点:
- JVM (应用服务):承载若依后端代码、Spring 容器、业务逻辑缓存。这是内存消耗的大头。
- MySQL:主要用于缓冲池(Buffer Pool)、排序缓冲区、线程栈等。
- Redis:纯内存数据库,所有数据都在内存中,内存占用 = 当前数据量 + 碎片率。
- 操作系统:需要预留一部分内存给文件系统和网络缓冲(通常建议预留 10%-15%)。
2. 常见部署场景与内存分配方案
场景 A:开发环境 / 单机轻量部署 (总内存 4GB – 8GB)
适用于个人学习或小型内部系统。
- 策略:采用“混合部署”,所有服务在同一台机器。
- 推荐配置:
- JVM (若依): 设置
-Xms和-Xmx为物理内存的 30%-40%。- 例如:总内存 4GB,JVM 设为
2g。 - 命令示例:
java -Xms2g -Xmx2g ...
- 例如:总内存 4GB,JVM 设为
- MySQL: 默认配置可能过高,需手动限制。
innodb_buffer_pool_size: 设置为物理内存的 20%-25% (约 1GB)。max_connections: 调低至 50-100(避免连接过多耗尽内存)。
- Redis:
maxmemory: 设置为物理内存的 10%-15% (约 500MB),防止 OOM。- 策略:开启淘汰机制
maxmemory-policy volatile-lru。
- JVM (若依): 设置
场景 B:生产环境 / 标准部署 (总内存 16GB – 32GB)
适用于企业级应用,建议将三个组件分离部署(或至少应用与数据库分离),以获得最佳性能。
方案一:三机分离(最推荐)
- 应用服务器 (若依):
- JVM 设置:
-Xms8g -Xmx8g(对于 16G 机器) 或-Xms16g -Xmx16g(对于 32G 机器)。 - 预留 10% 给 OS。
- JVM 设置:
- 数据库服务器 (MySQL):
innodb_buffer_pool_size: 设置为物理内存的 60%-70%。- 例如:32G 机器,设为 20G-22G。
- 缓存服务器 (Redis):
maxmemory: 设置为剩余可用内存的 80%(通常 4G-8G 即可满足大部分缓存需求)。
方案二:双机部署(应用 + 数据库/缓存同机)
如果资源有限,将 MySQL 和 Redis 放在同一台高性能服务器上,若依单独一台。
-
数据库服务器 (MySQL + Redis):
- 总内存规划:假设服务器 32GB。
- MySQL: 分配 16GB (
innodb_buffer_pool_size=16g)。 - Redis: 分配 8GB (
maxmemory=8g)。 - OS 预留: 8GB。
- 注意:需监控 Swap 使用情况,严禁频繁使用 Swap,否则性能会断崖式下跌。
-
应用服务器 (若依):
- 分配 8GB – 12GB 给 JVM (
-Xms8g -Xmx12g),具体视并发量而定。
- 分配 8GB – 12GB 给 JVM (
3. 关键配置文件修改指南
在实际操作中,请修改以下文件以生效上述策略:
(1) 若依 (Spring Boot) 启动参数
在 pom.xml 打包后的启动脚本或 Docker 环境变量中设置:
# 示例:设置堆内存为 4G
JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
- 注意:若依内置了 Actuator 和监控,过大的堆内存会导致 Full GC 时间变长,建议根据实际 TPS 调整,不要盲目拉满。
(2) MySQL (my.cnf 或 my.ini)
重点修改 [mysqld] 部分:
[mysqld]
# 核心参数:InnoDB 缓冲池大小,建议占物理内存的 50%-70%
innodb_buffer_pool_size = 4G
# 临时表空间限制,防止大查询撑爆内存
tmp_table_size = 64M
max_heap_table_size = 64M
# 连接数限制
max_connections = 200
thread_cache_size = 50
(3) Redis (redis.conf)
重点修改以下行:
# 最大内存限制,必须设置,防止 OOM
maxmemory 4gb
# 内存达到上限后的淘汰策略
maxmemory-policy allkeys-lru
# 日志级别(生产环境建议 info 或 warning,减少 IO 开销)
loglevel notice
4. 运维监控与调优建议
内存分配不是一劳永逸的,上线后需关注以下指标:
- 监控工具:
- 若依自带监控(Admin Dashboard)可查看 JVM 内存使用情况。
- 使用 Prometheus + Grafana 监控 MySQL 的 Buffer Pool Hit Rate 和 Redis 的 Memory Usage。
- Full GC 频率:
- 如果 JVM 出现频繁的 Full GC,说明堆内存设置过小或存在内存泄漏,需增大
-Xmx。 - 如果 Full GC 很少但响应慢,可能是堆内存过大导致单次 GC 停顿时间过长,可尝试减小
-Xmx并增加-Xms使其相等(避免动态扩容)。
- 如果 JVM 出现频繁的 Full GC,说明堆内存设置过小或存在内存泄漏,需增大
- Swap 交换分区:
- 在生产环境中,强烈建议关闭 Swap (
swapoff -a)。一旦 MySQL 或 Redis 开始使用 Swap,延迟会瞬间飙升到秒级甚至分钟级,导致系统假死。
- 在生产环境中,强烈建议关闭 Swap (
- Redis 碎片率:
- 检查
redis-cli info memory | grep used_memory_rss与used_memory的比例。如果碎片率超过 1.5,可能需要重启 Redis 或调整内存分配策略。
- 检查
总结建议
| 组件 | 推荐内存占比 (单机混合部署) | 推荐内存占比 (分离部署) | 关键配置参数 |
|---|---|---|---|
| JVM (若依) | 30% – 40% | 25% – 40% (视 CPU 核数) | -Xms, -Xmx |
| MySQL | 20% – 25% | 50% – 70% | innodb_buffer_pool_size |
| Redis | 10% – 15% | 10% – 20% | maxmemory |
| OS 预留 | 15% – 20% | 10% – 15% | Swap (建议关闭) |
最终建议:如果是新项目,建议先按分离部署规划资源。例如 16GB 内存的服务器,可以专门跑 MySQL (10GB) + Redis (4GB),若依部署在另一台 8GB 内存的服务器上 (JVM 6GB)。这样能最大程度避免资源争抢,保证系统稳定性。
云服务器