你好,欢迎进入江苏优软数字科技有限公司官网!

诚信、勤奋、创新、卓越

友好定价、专业客服支持、正版软件一站式服务提供

13262879759

工作日:9:00-22:00

点击芋道源码,微服务架构项目部署遇内存难题咋解决?

发布时间:2025-09-19

浏览次数:0

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

最近自己基于 Cloud 平台开发了一个微服务系统,在实施部署环节碰到了棘手问题:内存资源不足。该项目总共包含七个独立服务单元,由于个人仅配备一台阿里云服务器(配置为2核4G),因此所有服务必须集中部署。采用自制的fat jar格式镜像进行部署,每个服务单元在未进行任何JVM参数优化时,大约会消耗500M内存空间。

因为系统采用微服务架构,因此必须安装配置nacos,另外还运用了redis、elk等组件,其中mysql数据库是选用阿里云服务购买的,仅这些软件运行就需要消耗超过两吉内存,剩余的一吉内存,在部署四个微服务程序后便完全用尽,为此决定先对软件的内存使用情况进行基础调整改进

添加JVM参数优化内存大小


采用Spring Boot搭配MyBatis Plus,并运用Vue与Element技术栈,开发了一套后台管理平台,同时配备了用户专属的小程序应用,该系统具备RBAC动态权限管理机制,支持多租户模式,拥有数据权限控制功能,集成了工作流引擎,实现了第三方登录服务,包含支付处理模块,整合了短信发送功能,并具备完整的商城交易体系
>
> * 项目地址:该网站地址为gitee.com, 用户名为zhijiantianya, 项目名称为ruoyi-vue-pro
> * 视频教程://doc.iocoder.cn/video/>

[id_1160861372]1/64
-Xms128m

采用 Spring Cloud Alibaba、Gateway、Nacos、RocketMQ、Vue & Element 技术栈构建的后台管理系统,搭配用户小程序,具备RBAC动态权限管理、多租户支持、数据权限控制、工作流引擎、第三方登录认证、在线支付处理、短信服务发送、商城交易管理等实用功能
>
> * 项目地址:这个项目托管在 Gitee 平台上,位于 zhijiantianya 用户的空间内,具体路径是 yudao-cloud,这是一个开源的云服务项目。
> * 视频教程://doc.iocoder.cn/video/>

# JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4
-Xmx128m
# 规定了每个线程虚拟机栈及堆栈的大小,一般情况下,256k是足够的,此配置将会影响此进程中并发线程数的大小。
-Xss256k
# 指定并行GC线程的数量,一般最好和CPU核心数量相当
-XX:ParallelGCThreads=2

当剩余堆空间不足百分之四十,JVM会扩展堆至-Xmx的上限;当剩余堆空间超过百分之七十,JVM会收缩堆至-Xms的下限。

所以通常让服务器的-Xms和-Xmx参数保持一致,这样做是为了防止每次进行垃圾回收后还要重新调整堆内存的容量。负责回收对象堆内存的工作,是由一个叫做垃圾回收器的自动内存管理程序来完成的。

通常情况下,若处理器核心数少于八个,该参数数值就等于处理器核心数,我的服务器拥有两颗处理器,因此可以忽略这个设置项。部署设置之后,重启服务察觉到内存容量确实有所降低,从原先的五百兆缩小到一百到两百兆之间,然而这并非我所追求的结果,我理想中的内存使用量应当降低到几十兆的范围。

通过广泛检索网络信息,了解到这个新方法能够满足我的要求,该技术目前正处在高速发展阶段,变化频繁,比较适合个人研究,不建议在实际业务中应用。

项目使用 后:

应用启动速度特别快,毫秒级别

运行时内存占用更少,官方公布的包含引导程序、模型视图控制器等组件的镜像体积为五十兆

要实现上述目标,需要付出更长的构建时间,即使是创建一个简单的问候语,也需要两分钟,当然,这主要受到计算机性能的影响,我的设备大约需要两分钟。

简而言之就是为了提高Java在云原生的竞争力(个人理解)。

以下内容摘抄自上 的自述文件:

为试用原生映像编译器将应用程序编译为原生可执行文件提供测试支持,目的是提供通常设计为封装在小型容器里的原生部署方案。实际目标是在这个新平台上运行几乎未做修改的 Boot 应用程序。

以下内容摘抄自其他博客:

近些年,“原生”这个概念频繁出现在云计算、边缘计算等行业中,而原生技术所偏爱的语言,也始终是Rust这类无需依赖运行环境开发的编程语言。Java凭借其在上世纪因“一次编译,到处执行”理念而广受欢迎,至今仍然流行,但由于这个特性,Java程序无法摆脱JVM的运行环境,因此不太容易被原生技术所采用。当前云化技术盛行,笨重的JVM导致Java程序与其他语言相比显得格外臃肿,众多专家为此探索了多种途径,力求让Java更加轻量化。

本次实战相关的环境信息如下:

从官方文档得知(上图)

运行该软件务必借助 Java 11 或 Java 17 进行编译工作

构建 Boot 原生应用程序有两种主要方法:

使用 Boot 支持生成包含本机可执行文件的轻量级容器。

使用 原生镜像 Maven 插件支持生成原生可执行文件。

尝试了多种方案,最终在本地顺利实现了方案甲和方案乙。概括而言:

方法1是在版本3之后,可以借助启动maven插件来制作镜像,运用mvn -boot:build-image指令与相关接口,完成原生Boot应用的构建,执行成功后会立刻得到一个镜像,然后直接运行这个镜像即可,无需我们手动编码,所有相关参数都在pom.xml文件中进行设置(在该插件的标签区域,配置方式与maven的或插件的配置类似)。

方法二无需预先安装,但后续需进行安装,接着输入mvn指令,便会得到一个可执行程序(.exe格式),直接启动就能使用。

主要区别如下

每个微服务都以部署形式而非可执行文件运行,因此方法一完全契合我的要求intellij idea golang plugin,接下来将采用 Boot 方式来开发 Boot原生的应用程序。

官方下载地址:

https://www..org//

关于方法1而言,前述三幅图像似乎仅需设定参数即可,若期望一次性达成目标,建议全部配置到位,事后可自行进行检验。

检验是否安装成功

打开新的cmd,输入以下命令,等待安装

Spring Cloud Alibaba微服务架构内存优化_intellij idea golang plugin_Spring Native构建原生应用程序

gu install native-image

此次操作未能成功,应对措施为从上方手动获取-image,接着进行解包,再进行安装

这个网址包含了多个部分,首先是以https://开头,接着是.com,然后有-ce-和///,之后是vm-21.3.0,再后面是-图像--svm---amd64-21.3.0.jar,整体来看这是一个下载链接,包含了软件版本和系统架构等信息。

jar用也是可以解压的,解压后如下

在bin目录下打开cmd,输入以下命令,等待安装

$ gu install -L native-image*

具体步骤略,按照官方文档操作即可:

https://docs..com////

前面都是准备工作,这一步开始才是重点

首先快速创建一个 Boot项目,我命名为-

完整的pom如下


<project xmlns=这个网址指向的是 Maven 的 POM 文件格式版本 4.0.0 的官方文档,它包含了该版本规范的所有详细信息,是开发者配置项目时的重要参考依据。 xmlns:xsi=这个网址的规范格式是 http://www.w3.org/2001/XMLSchema-instance, 它用于定义 XML 模式的验证细节, 属于 W3C 组织发布的标准, 主要目的是确保 XML 数据的结构正确性, 提供了一套完整的约束规则体系, 方便开发者创建和校验符合要求的 XML 文件, 在 Web 开发中扮演着重要的基础性角色。
         xsi:schemaLocation=Apache Maven的POM文件版本为4.0.0, 对应的XML Schema文档位于指定网址>

    <modelVersion>4.0.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.6.2version>
        <relativePath/> 
    parent>
    <groupId>ltd.pcddgroupId>
    <artifactId>spring-nativeartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>spring-nativename>
    <description>spring-nativedescription>
    <properties>
        <java.version>11java.version>
        <repackage.classifier/>
        <spring-native.version>0.11.1spring-native.version>
    properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework的实验性组件groupId>
            <artifactId>spring-nativeartifactId>
            <version>${spring-native.version}version>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.experimentalgroupId>
                <artifactId>spring-aot-maven-pluginartifactId>
                <version>0.11.1version>
                <executions>
                    <execution>
                        <id>generateid>
                        <goals>
                            <goal>generategoal>
                        goals>
                    execution>
                executions>
            plugin>

            
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder:tinybuilder>
                        <env>
                            <BP_NATIVE_IMAGE>trueBP_NATIVE_IMAGE>
                        env>
                    image>
                configuration>
            plugin>
        plugins>
    build>

    <repositories>
        <repository>
            <id>spring-releaseid>
            <name>Spring releasename>
            <url>获取最新发布版本,请访问该网址。url>
        repository>
    repositories>

    <pluginRepositories>
        <pluginRepository>
            <id>spring-releaseid>
            <name>Spring releasename>
            <url>https://repo.spring.io/releaseurl>
        pluginRepository>
    pluginRepositories>

project>

本文说明的是 .11.1 版本,该版本配套的启动版本务必是 2.6.2,这仅是一个最基础的设置范例,实际制作时必须在 -boot-maven- 插件的部分里设定为数不少的其他参数。

远端的位置和凭证的方位,虚拟机优化的设定,设定文件的指引,软件包的名称端口仓库的方位等等,最适宜的途径就是参看启动-maven-的正式资料,以设定虚拟机配置为例

通过官方文档得知只需要在标签下配置即可,例如


 paketobuildpacks/builder:tiny
 
  true
  "preserve"> 
  -Xms128m
  -Xmx128m
  -Xss256k
  -XX:ParallelGCThreads=2
  -XX:+PrintGCDetails
 


其他的配置参数还有很多。

官方文档:

文档中提供的链接指向了特定版本的指南内容,该内容详细说明了如何构建镜像,具体路径为 https://docs..io/-boot/docs/2.6.2/maven-///#build-image

mvn clean
mvn '-Dmaven.test.skip=true' spring-boot:build-image

安装所有必需组件之后,机器散热风扇立刻发出巨大声响,通过系统监控界面看到中央处理器工作负荷达到峰值,内存占用急剧攀升,最终维持在九成以上。

构建成功

查看所有镜像

-就是构建的镜像

创建并运行容器

检查记录时intellij idea golang plugin,了解到软件顺利开启,整个过程仅用了些时间,具体是59毫秒,确实证明了开启过程以毫秒计的说法。

成功调用接口

在 查看占用内存,仅28M左右。

不使用 启动应用

启动耗时3s,占用内存高达511M,高下立判。

文章仅供参考,建议结合 官方最新文档学习。

文档链接为docs.io,路径为-/docs-//index.html。

诚邀您加入我的知识社群,共同研究系统设计,分享代码经验。注册途径,请按压下方的条形码图像。

已在知识星球更新源码解析如下:

最新推出了《芋道 2.X 入门》系列内容,目前已发布超过一百篇,囊括了诸多主题,例如 Redis 数据库、ES 搜索引擎、分库分表技术、读写分离方案、权限控制机制、Dubbo 服务治理、Kafka 消息队列以及性能测试方法等。

呈现约三万行代码的范例,并且展示超过四万行代码的网上商城微服务工程。

如有侵权请联系删除!

13262879759

微信二维码