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

14 篇文章 0 订阅

本文翻译自:https://medium.com/@satanjim/how-we-reduced-the-memory-consumption-of-spring-boot-application-over-40-for-the-development-c8a5813fac23

在开发基础的 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"的文件,并输入以下值(稍后我们会解释这些值的含义):

# 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 将这些环境变量传递到容器中:

# 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,并理解内存消耗的原理,我们可以降低本地开发环境的内存消耗,提高工作效率。希望这些提示能对您有所帮助!

关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、国外优质文章翻译等,您的关注将是我的更新动力!

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要搭建Spring Boot开发环境,你需要完成以下几个步骤: 1. 安装Java开发工具包(JDK):首先,确保你的计算机上已经正确安装了Java Development Kit(JDK),并且配置了相应的环境变量。 2. 安装集成开发环境(IDE):选择一个适合你的喜好和需求的集成开发环境,例如Eclipse、IntelliJ IDEA或者NetBeans等。下载并按照官方指示安装。 3. 创建Spring Boot项目:打开你选择的IDE,创建一个新的Spring Boot项目。IDE通常提供了相应的项目模板或者向导来简化项目的初始化过程。 4. 导入Spring Boot依赖:在项目的构建配置文件(例如Maven的pom.xml或者Gradle的build.gradle)中,添加Spring Boot相关的依赖。你可以在官方文档或者Maven中央存储库中找到所需的依赖信息。 5. 编写代码:根据你的需求,编写Spring Boot应用程序的代码和业务逻辑。你可以创建控制器、服务、实体类以及其他必要的组件。 6. 运行和调试:使用IDE提供的运行和调试功能,启动你的Spring Boot应用程序。你可以选择直接运行主应用程序类,或者通过命令行工具使用Maven或者Gradle运行。 7. 测试和部署:编写单元测试来验证你的应用程序的功能。一旦你确认应用程序可以正常运行,你可以将其部署到服务器上,以供实际使用。 以上是搭建Spring Boot开发环境的基本步骤,具体细节可能因个人偏好和项目需求而有所不同。你可以参考Spring Boot官方文档和相关教程来获取更详细的指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值