2核2G服务器运行Ruoyi-Cloud时如何降低内存占用?

在 2 核 2G(2GB 内存)的服务器上运行 Ruoyi-Cloud(基于 Spring Cloud 的微服务架构)是一个极具挑战性的场景。Spring Cloud 默认配置通常是为更高配置的服务器设计的,直接运行极易触发 OOM(Out Of Memory)或系统频繁 Swap 导致卡死。

要在此类低配环境下成功运行,必须对JVM 参数微服务组件数据库以及中间件进行全方位的“瘦身”和精简。以下是具体的优化方案:

1. 核心策略:精简微服务架构(最关键)

Ruoyi-Cloud 包含十几个微服务(如 ruoyi-admin, ruoyi-gateway, ruoyi-auth, ruoyi-system, ruoyi-job 等)。在 2G 内存下,全量启动几乎是不可能的

  • 方案 A:单体化部署(推荐)

    • ruoyi-common 模块提取出来,把 ruoyi-systemruoyi-authruoyi-job 等核心业务逻辑合并到一个 Jar 包中。
    • 去掉 Nacos/Eureka 注册中心依赖,使用本地配置。
    • 去掉 Gateway 网关层,直接在 Controller 层处理请求(或者只保留最基础的鉴权)。
    • 效果:内存占用可从 1.5GB+ 降至 600MB-800MB,留出空间给数据库和 Redis。
  • 方案 B:按需启动(如果必须保留微服务)

    • 只启动最核心的服务:ruoyi-admin (后端核心) + ruoyi-auth (认证)。
    • 暂时关闭非核心服务:ruoyi-gateway (可改为 Nginx 反向X_X), ruoyi-quartz/job (手动调度), ruoyi-monitor (监控)。
    • 注意:Nacos Server 本身非常吃内存(建议至少 1G),如果必须用 Nacos,建议将其迁移到另一台机器,或者改用轻量级的 Eureka(已停止维护但极轻)或 Consul,甚至直接用硬编码 IP 调用(不推荐生产环境)。

2. JVM 参数调优

无论采用哪种架构,必须强制限制每个 Java 进程的堆内存。默认的 -Xmx 通常是物理内存的 1/4 或更多,这在 2G 机器上是致命的。

修改所有服务的启动脚本(startup.shpom.xml 中的 Maven 插件配置),添加以下参数:

# 关键参数说明
-Xms512m      # 初始堆大小设为 512MB
-Xmx512m      # 最大堆大小严格限制为 512MB (防止膨胀)
-XX:MetaspaceSize=128m # 元空间上限
-XX:MaxMetaspaceSize=256m # 元空间最大限制
-XX:+UseG1GC  # 使用 G1 垃圾回收器,减少停顿
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dump # 崩溃时生成堆 dump 方便排查
-XX:+PrintGCDetails -XX:+PrintGCDateStamps # 可选:用于观察 GC 情况

针对 Nacos Server 的特殊处理:
如果必须运行 Nacos,它需要独立的内存。建议单独分配 512M-768M 给它:

JAVA_OPTS="-server -Xms512m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m"

3. 数据库与中间件优化

2G 内存不仅要留给 Java,还要留给 MySQL 和 Redis。

  • MySQL (MariaDB)

    • 不要使用默认的 innodb_buffer_pool_size(默认可能高达几百 MB)。
    • 修改 my.cnf,将其限制在 256M – 384M 之间。
      [mysqld]
      innodb_buffer_pool_size = 256M
      max_connections = 50
      thread_cache_size = 10
    • 替代方案:如果数据量小,考虑使用 SQLiteH2 内嵌数据库(仅用于开发或极低并发测试),完全省去独立进程内存。
  • Redis

    • 修改 redis.conf,设置 maxmemory128M256M,并启用淘汰策略:
      maxmemory 256mb
      maxmemory-policy allkeys-lru

4. 应用代码与配置层面的微调

  • 关闭不必要的功能

    • application.yml 中禁用 Swagger/Knife4j 文档生成(生产环境不需要,且消耗内存)。
    • 禁用 Actuator 的某些端点(如 /metrics, /threaddump),减少监控开销。
    • 关闭 spring.cloud.nacos.config.enabled=false(如果改用本地配置文件)。
  • Docker 容器限制
    如果你使用 Docker 部署,务必在 docker rundocker-compose.yml 中显式限制资源,防止容器无限制占用宿主机内存:

    services:
      ruoyi-admin:
        image: ...
        mem_limit: 600m  # 限制容器总内存
        deploy:
          resources:
            limits:
              cpus: '1.5'

5. 运维层面的兜底措施

  • 开启 Swap 分区
    虽然 Swap 会降低性能,但在 2G 内存下是防止 OOM Killer 杀死进程的最后一道防线。

    # 创建 2G 的 swap 文件
    dd if=/dev/zero of=/swapfile bs=1M count=2048
    chmod 600 /swapfile
    mkswap /swapfile
    swapon /swapfile
    # 设置 vm.swappiness=10 (让系统尽量不使用 swap,只在必要时使用)
    sysctl vm.swappiness=10
  • 监控与告警
    安装轻量级监控工具(如 htop 或简单的 Shell 脚本),监控内存使用率。一旦接近 90%,立即重启服务或扩容。

总结建议

在 2 核 2G 服务器上运行 Ruoyi-Cloud,最可行的路径不是“优化现有架构”,而是“重构架构”

  1. 首选:将项目改造为单体应用(去掉 Nacos, Gateway, 多个微服务 Jar),配合 JMX 限制 JVM 为 512M,MySQL 限制 256M,Redis 限制 128M。这样总内存占用可控制在 1.2GB 以内,系统能流畅运行。
  2. 次选:如果必须微服务,则必须将 Nacos 移出该服务器,并在应用侧通过硬编码连接数据库,仅保留核心业务服务。

警告:即使经过上述优化,2G 内存也仅适合个人学习、内部测试或极低并发(<50 QPS)的生产环境。如果涉及真实用户访问,强烈建议升级到 4 核 4G 以上的服务器。