如何将开发环境的 Spring Boot 应用程序内存降低 40% 以上

本文翻译自:medium.com/@satanjim/h...,作者:Shoeb Ahmed Tanjim

在开发基础的 Spring Boot 应用程序时,我们需要考虑可承受的内存消耗。随着添加更多依赖项,内存消耗也会增加。对于整体应用程序,通常仍然可以承受内存消耗,但当我们开发多个微服务并在本地计算机上运行时,这可能成为一场噩梦,影响开发效率。

Spring Boot 和 JVM 都带有一些默认配置,适用于大多数情况,甚至在某些生产环境中也能胜任。但是如果我们能调整一些配置来适应本地开发,就可以显著减少内存消耗。请注意,我不是 JVM 和 Spring Boot 方面的专家,只是想在这篇文章中分享一些我自己的经验。

谁消耗了内存

首先,让我们了解一下,到底是谁在消耗内存呢?没错,是 JVM。但是它是如何做到的呢?

要深入了解这个问题,我们需要了解 JVM 的内部结构,但这超出了本文的范围。简单来说,JVM 的内存消耗可以分成堆(Heap)、元空间(Metaspace)、每个线程的堆栈(Thread Stack)以及其他。

为了减少内存消耗,我们需要向 JVM 显式地传递一些参数。

首先,我们需要进行一些前置准备:

  • 安装 Docker 和 docker-compose
  • 使用 Java 17 版本(但是 8 到最新版本之间的任何版本应该都可以,除了 Java 8 中的一些旧补丁)
  • 使用 Spring Boot

接下来,我们可以配置一些参数。创建一个名为"dev.jvm.conf"的文件,并输入以下值(稍后我们会解释这些值的含义):

bash 复制代码
# dev.jvm.conf
# 覆盖应用程序的属性
SERVER_TOMCAT_ACCEPT_COUNT=3
SERVER_TOMCAT_MAX_CONNECTIONS=3
SERVER_TOMCAT_THREADS_MAX=3
SERVER_TOMCAT_THREADS_MIN_SPARE=1
SPRING_MAIN_LAZY_INITIALIZATION=true

# 设置JVM参数
JAVA_TOOL_OPTIONS=-XX:+UseSerialGC -Xss512k -XX:MaxRAM=200m

然后,我们使用 docker-compose 将这些环境变量传递到容器中:

bash 复制代码
# docker-compose.yml
services:
  service1:
    image: service1:dev
    env_file:
      - dev.jvm.conf

  service2:
    image: service2:dev
    env_file:
      - dev.jvm.conf

现在运行docker-compose up命令,您应该能看到一些差异。

接下来,让我们详细讨论一下这些配置

在开始之前,请记住,降低某些值不会直接减少本地环境中的内存使用量,因为本地环境中通常不会有那么多请求。我们添加阈值的目的是,即使在本地环境中,如果我们开始收到更多请求,也要限制其数量。这最终将有助于限制内存使用。

  • SERVER_TOMCAT_ACCEPT_COUNT:该属性设置了当所有可能的请求处理线程都在使用时,传入连接请求的最大队列长度。当服务器负载较重且所有工作线程都繁忙时,传入的请求将被放入队列中。如果队列已满,额外的连接请求将被拒绝。默认值为 100。

  • SERVER_TOMCAT_MAX_CONNECTIONS:该属性定义了 Tomcat 服务器同时能够处理的最大连接数。默认值为 8192。

  • SERVER_TOMCAT_THREADS_MAX:该属性控制 Tomcat 服务器将创建的请求处理线程的最大数量。默认值为 200。

  • SERVER_TOMCAT_THREADS_MIN_SPARE:该属性为嵌入式 Tomcat 服务器设置了最小备用线程数。默认值为 10。

  • SPRING_MAIN_LAZY_INITIALIZATION:将该属性值设置为 true 意味着应用程序中的所有 bean 都将延迟初始化。这将有助于缩短启动时间。

  • JAVA_TOOL_OPTIONS:使用该属性,我们可以向 JVM 传递一些额外的参数。让我们来谈谈其中的每个参数意义。

    • -XX:+UseSerialGC:这个参数会使 JVM 使用单线程进行内联垃圾收集,而不是使用专用的 GC 线程。
    • -Xss512k:这个参数将每个线程的堆栈大小限制为 512KB,而不是默认的 1MB。
    • -XX:MaxRAM=200m:这个参数设置 JVM 最大可使用的 RAM 内存为 200MB。

这是一些简单的调整,但它们可以在本地开发环境中显著减少内存消耗。当然,根据您的具体情况,您可能需要进一步进行调整。这只是一个起点,您可以根据实际需求进行优化。

总结

总而言之,通过适当配置 JVM 和 Spring Boot,并理解内存消耗的原理,我们可以降低本地开发环境的内存消耗,提高工作效率。希望这些提示能对您有所帮助!

相关推荐
杨凯凡6 小时前
【021】反射与注解:Spring 里背后的影子
java·后端·spring
riNt PTIP6 小时前
SpringBoot创建动态定时任务的几种方式
java·spring boot·spring
invicinble7 小时前
spirng的bean的生命周期,以及为什么这么设计
spring
星晨羽8 小时前
西门子机床opc ua协议实现变量读写及NC文件上传下载
java·spring boot
yuweiade8 小时前
Spring Boot 整合 Redis 步骤详解
spring boot·redis·bootstrap
三水不滴9 小时前
SpringAI + SpringDoc + Knife4j 构建企业级智能问卷系统
经验分享·spring boot·笔记·后端·spring
2601_9498146910 小时前
Docker部署Spring Boot + Vue项目
vue.js·spring boot·docker
9523612 小时前
Spring IoC&DI
java·数据库·spring
RDCJM13 小时前
Springboot的jak安装与配置教程
java·spring boot·后端
云烟成雨TD13 小时前
Spring AI Alibaba 1.x 系列【39】四大多智能体(Multi-agent)架构
java·人工智能·spring