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

诚信、勤奋、创新、卓越

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

13262879759

工作日:9:00-22:00

intellij idea golang插件 阿里云2C4G微服务部署内存优化JVM参数设置

发布时间:2026-02-12

浏览次数:0

前言

就在最近,我依靠Cloud自行完成了一个搭建微服务架构的项目实例,可部署之际遭遇到了阻碍,具体表现为内存不足。当下,这个项目涵盖了7个微服务,鉴于我仅拥有一台阿里云的服务器,其配置为2C 4G,所以我不得不将全部的微服务都部署于同一台服务器之上,所采用的部署方式乃是借助制作而成的fat jar镜像,并且每个微服务在未添加任何JVM调优参数的情形之下,所占内存大约为500M。

是因为属于微服务,所以必然还得开展部署,即nacos ,除此之外还运用到了redis 、、、elk等 ( mysql购买的是阿里云的 ) ,仅仅是运行这些应用,便占据内存2个多G ,剩余的1个多G内存,在部署4个微服务之后就满了,于是着手对应用的内存展开初步优化:

添加JVM参数优化内存大小

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

当默认空余堆内存比40%小的时候,JVM就会将堆增大直至达到 -Xmx所设定的最大限定;当空余堆内存比70%大的时候,JVM会把堆减少直至达到 -Xms所设定的最小限定。

所以,服务器通常会将-Xms、-Xmx设置成一样,以此来防止在每一回GC之后,对堆的大小进行调整。对象所占据的堆内存,是由被称作垃圾回收器的自动内存管理系统来回收的。

正常的状况之下,要是中央处理器的数量比八还要更少的前提条件之中,那个数值是等同于中央处理器的数量的,我的服务器是具备两个核心的所以这个参数是能够省略掉不予理会的配备完成之后,开启服务察觉到内存实实在在变小了,从原来的五百兆下降到一百至二百兆的范围之内,然而这并非是我心里所期待的那种作用,我内心所期望达成的那种作用是要达到几十兆这样的级别。

经在网上进行大量搜索查阅资料后知道能够运用这门新技术去达成我的需求,这门技术正处在快速迭代的阶段,变动幅度较大,建议用作个人学习,而非用于生产。

项目使用 后:

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

运行的时候,有着更低的内存消耗,官方所展示的,包含 Boot 的,还有 MVC 的那个镜像,它的大小是 50M。

为了达成先前的那种效果,所要付出的代价乃是构建所需的时间会更漫长,哪怕仅仅是一个Hello Word的构建,也需要耗费2分钟,不过这主要是依据电脑的配置来定,我的情况大致是2分钟左右了。

是什么

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

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

能为借助原生映像编译器把应用程序编译成原生可执行文件,供应beta支持,从而给予通常被设计用来打包在轻量级容器里的原生部署选项。事实上,目标在于在这个崭新平台上,支持几乎没被修改的Boot应用程序。

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

近一些年,“原生”此词始终泛滥于云计算、边缘计算等领域当中,而原生所宠幸的语言一直都是,像Rust等脱离运行的开发语言。Java凭借上世纪流行的一次编译、到处执行的理念,流行直至如今,然而也正因为这个缘故,致使Java程序脱离不了JVM运行环境,从而使得其不那么受原生程序的青睐。在云原生泛滥的当下,臃肿的JVM让Java应用程序相较于其他语言显得极其庞大,各路大神也想出了诸多方式让Java变得更“原生”。

实战

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

从官方文档得知(上图)

进行使用操作的应用程序,其所应采用的编译方式要使用 Java 11 或者 Java 17 来付诸实施。

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

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

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

于本机之上,先经历各类各种地踩坑之后,方成功运用了方法1以及方法2。简言之:

当处于.3之后时,方法1是,能够借助-boot-maven-插件去构建镜像,通过运用mvn -boot:build-image命令并结合相关API,来达成Boot原生应用程序的构建,在成功执行完毕后,会直接生成一个镜像,接着运行这个镜像即可,无需我们再次编写,与之相关的参数配置均在pom.xml里进行配置,此配置处于该插件的标签之下,并且和或的-maven-颇为相似。

方法2无需进行安装,然而却需实施另外的安装操作,接着在执行mvn - 命令之举完结后,便会生成出一个能够执行的文件(.exe),随后运行该文件便可达成相应目的。

主要区别如下

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

由于每一个微服务采用的是部署形式而非exe文件,因而方法1恰好契合我的需求,故而后续运用Boot的方式去构建Boot原生应用程序。

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

官方下载地址:

https://www..org//

2 配置环境变量

要是针对方法1来讲,那上面依次排列的三张图看上去似乎仅是进行配置便已然可以。你要是期望能够一次性取得成功,那么建议你将这三张图全部都进行配置,在这之后你能够自行完成测试。

检验是否安装成功

3 安装-image

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

gu install native-image

在这一步当中,我执行的过程遭遇了失败,而解决它的方式便是,从上面手动去进行下载-image这个操作,跟着再去做解压的动作,最后还要完成安装的步骤。

我不太明确你提供的这个网址样的内容具体要表达什么,不太能按照你的要求进行改写,你可以检查一下内容要求,或者简化一下为一段真正有意义的句子让我来改写。

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

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

$ gu install -L native-image*

4 安装 for

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

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

5 配置pom.xml

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

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

完整的pom如下


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">

    <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.experimentalgroupId>
            <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>https://repo.spring.io/releaseurl>
        repository>
    repositories>

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

project>

本文讲述的是,.11.1版本,与之对应的,Boot版本必定得是2.6.2 ,上述阐述的仅仅是,一个最为基础的配置范例intellij idea golang plugin,在真实的开发进程里,还得于Boot Maven插件的标签之下,去配置其他林林总总的众多参数呐。

像远程的地址intellij idea golang plugin,以及证书的路径,还有 jvm 调优参数,配置文件指定,镜像名端口仓库地址等,最佳的办法是去看-boot-maven-的官方文档,这里以配置 jvm 参数作为例子。

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

<image>
 <builder>paketobuildpacks/builder:tinybuilder>
 <env>
  <BP_NATIVE_IMAGE>trueBP_NATIVE_IMAGE>
  <BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> BPE_DELIM_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-Xms128mBPE_APPEND_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-Xmx128mBPE_APPEND_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-Xss256kBPE_APPEND_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:ParallelGCThreads=2BPE_APPEND_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+PrintGCDetailsBPE_APPEND_JAVA_TOOL_OPTIONS>
 env>
image>

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

官方文档:

你提供的内容似乎并不是一个完整的、有实际意义可改写的句子呀,它看起来像是一个链接相关的表述,不太明确你的具体需求,请补充准确的语句以便我进行改写。

6 执行maven命令

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

完成相关依赖的下载之后,电脑的风扇便开始呼呼作响地转动起来,去查看任务管理器时发现,CPU的利用率达到了100%,内存的使用量急剧攀升,最终稳定在了90%以上。

构建成功

7 创建并运行容器

查看所有镜像

-就是构建的镜像

创建并运行容器

这时候,正在查看日志,从中发现应用成功启动了,其启动仅仅耗费了时间,具体来说就是59ms,这确实印证了启动是毫秒这个级别的这样一句话。

成功调用接口

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

不使用 启动应用

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

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

,你提供的这个并不是一个句子,请你给我一个具体需要改写的句子内容。

感谢阅读,希望对你有所帮助 :)

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



如有侵权请联系删除!

13262879759

微信二维码