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

诚信、勤奋、创新、卓越

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

13262879759

工作日:9:00-22:00

intellij idea golang plugin Spring Cloud Alibaba微服务项目部署难题:内存不够如何解决?

发布时间:2025-09-25

浏览次数:0

来源:blog.csdn.net////

前言

最近自己借助 Cloud 平台开发了一个基于微服务架构的项目,在实施部署环节遭遇了瓶颈:系统内存资源不足。现阶段该体系包含七个独立微服务单元intellij idea golang plugin,由于仅配备一台阿里云服务器(具备2核4GB配置),所有服务必须集中部署在同一台主机上。采用自制的 fat jar 镜像进行部署,且各微服务在未设置任何 JVM 参数优化措施时,平均消耗内存量约500MB。

因为系统采用微服务架构intellij idea golang plugin,因此必须安装配置nacos,另外还运用了redis、elk等组件,其中mysql数据库是购买自阿里云平台的,仅这些程序就消耗了超过两吉的内存空间,剩余的一吉内存,在部署四个微服务项目后即告罄,为此决定着手对程序的内存使用情况进行基础优化

添加JVM参数优化内存大小

JVM最初分配的内存容量,通过-Xms参数来设定,系统预设值为系统总内存的六十四分之一
-Xms128m
JVM所能分配的最大内存量通过-Xmx参数来设定,其初始值通常为系统总内存的四分之一左右
-Xmx128m
设定了线程虚拟内存区及数据区的容量,通常情况下,256千字节即可满足需求,这种设置会决定该程序中同时运行的线程数量。
-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 插件支持生成原生可执行文件。

尝试了多种方案,最终在本地实现了方案一和方案二的成功应用。概括而言:

构建镜像的一种方式是在版本号点三之后,运用boot-maven插件来执行,通过mvn -boot:build-image命令与相关API配合,能够完成原生Boot应用的构建,一旦构建成功便会直接得到一个可用的镜像,之后直接运行该镜像即可,无需进行额外编写,所有相关参数的设定都在pom.xml文件中进行,具体位置在该插件的标签下面,其配置方式与maven插件的配置类似

方法二无需预先部署,但必须先进行安装,接着输入mvn指令,随后会得到一个可运行程序(即.exe文件),直接启动就能使用。

主要区别如下

1 环境依赖不同2 执行的maven命令不同

因为每个微服务使用部署而不是exe文件,

所以方法1正好符合我的需求,

所以后文使用 Boot 的方式构建 Boot原生应用程序。

1 安装Graal VM(-ce---amd64)

官方下载地址:

https://www..org//

图片

图片2 配置环境变量

图片

图片

图片

针对方法1的话,上面三张图好像只用配置就行,

想一次成功的话建议3个都配,后续可以自行测试。

检验是否安装成功

图片3 安装-image

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

gu install native-image

这一步我执行失败了,解决方法就是从上

手动下载-image,然后解压、安装

这个网址指向一个特定的软件版本,具体是虚拟机管理软件的21.3.0版本,文件格式为JAR,适用于AMD64架构,文件名为svm---amd64-21.3.0.jar,发布在某个网络位置,路径包含了特定的标识符和前缀。

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

图片

Spring Boot原生映像构建_intellij idea golang plugin_Spring Native微服务内存优化

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

$ gu install -L native-image*

4 安装 for

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

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

5 配置pom.xml

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

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

完整的pom如下

"1.0" encoding="UTF-8"?>
那个网址指向的是 Maven 的 POM 文件格式版本 4.0.0的标准文档。 xmlns:xsi=这个网址的规范形式为 http://www.w3.org/2001/XMLSchema-instance。
         xsi:schemaLocation=Apache Maven的POM标准版本为4.0.0, 对应的XML模式定义文件位于指定网址>
    4.0.0
    
        org.springframework.boot
        spring-boot-starter-parent
        2.6.2
         
    

    ltd.pcdd
    spring-native
    0.0.1-SNAPSHOT
    spring-native
    spring-native
    
        11
        
        0.11.1
    


    
        
            org.springframework.boot
            spring-boot-starter-web
        

        
        
            spring 实验性组件库
            spring-native
            ${spring-native.version}
        

    


    
        
            
                org.springframework.experimental
                spring-aot-maven-plugin
                0.11.1
                
                    
                        generate
                        
                            generate
                        

                    

                

            


            
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    
                        paketobuildpacks/builder:tiny
                        
                            true
                        

                    
                

            

        

    


    
        
            spring-release
            Spring release
            官方软件仓库的公开下载区域,里面存放着可获取的发布版本文件,通过这个网址可以找到相关资源
        

    


    
        
            spring-release
            Spring release
            https://repo.spring.io/release
        

    



本文介绍的是 .11.1版本,

其对应的 Boot版本必须是2.6.2,

以上只是一个最基本的配置案例,

实际开发中还需要在-boot-maven-插件

的标签下配置其他许许多多的参数。

例如远程的地址和证书的路径、jvm调优参数、

配置文件指定、镜像名端口仓库地址等等,

最好的方法就是看-boot-maven-的官方文档,

这里以配置jvm参数为例

图片

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


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


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

官方文档:

https://文档..io/-启动文档/2.6.2/构建工具/详细指南/生成镜像文件

6 执行maven命令

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

安装好必需的组件之后,机器的冷却风扇立刻发出嗡嗡的声响,通过作业控制台进行确认得知

CPU利用率100%,内存使用量飙升,最后稳定在90%+。

构建成功

图片7 创建并运行容器

查看所有镜像

图片

-就是构建的镜像

创建并运行容器

图片

在 查看日志,发现应用成功启动,启动仅耗时。

也就是59ms,果然印证了 启动是毫秒级别这句话。

图片

成功调用接口

图片

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

图片

不使用 启动应用

图片

图片

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

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

资料链接

清华学姐自学的Linux笔记,天花板级别!

新版鸟哥Linux私房菜资料

阿里大佬总结的《图解Java》火了,完整版PDF开放下载!

Alibaba官方上线!SpringBoot+SpringCloud全彩指南

国内最强的SpringBoot+Vue全栈项目天花板,不接受反驳!

欢迎添加个人微信   进粉丝群或围观朋友圈

如有侵权请联系删除!

13262879759

微信二维码