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

诚信、勤奋、创新、卓越

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

13262879759

工作日:9:00-22:00

intellij idea golang plugin JVM堆内存设置及相关参数说明,你了解多少?

发布时间:2025-06-09

浏览次数:0

前言

近期,我尝试运用Spring Cloud Alibaba技术搭建了一个微服务架构项目,但在部署过程中遭遇了挑战:系统内存资源不足。目前,本项目中包含七个微服务;鉴于我仅拥有一台配置为2核4G的阿里云服务器,因此不得不将所有微服务集中部署在同一台服务器上。部署过程中,我采用了Docker技术来构建Spring Boot的fat jar镜像。值得注意的是,即便没有进行任何JVM调优参数的调整,每个微服务所占用的内存大约在500M左右。

微服务架构的特性决定了必须进行部署:包括nacos,以及redis、sentinel、rocketmq、elk等(其中mysql是购买自阿里云的)。仅这些应用的运行便需占用2G以上的内存,而在部署4个微服务后,剩余的1G多内存空间便告罄。因此,我们着手对springboot应用的内存进行了初步的优化措施。

添加JVM参数优化内存大小

JVM在启动时分配的内存容量通过参数-Xms来设定,其默认值通常为物理内存的1/64。
-Xms128m
JVM所能分配的最大内存量由参数-Xmx设定,其默认值通常为物理内存的四分之一。
-Xmx128m
该规定明确了每个线程的虚拟机栈和堆栈容量,通常情况下,256KB的配置是足够的,这样的设置将直接决定该进程能够支持的最大并发线程数量。
-Xss256k
# 指定并行GC线程的数量,一般最好和CPU核心数量相当
-XX:ParallelGCThreads=2

当堆内存的剩余空间低于40%时,JVM会自动扩充堆内存至最大限制值-Xmx;反之,若剩余空间超过70%,JVM则会相应缩减堆内存至最小限制值-Xms。

因此,服务器通常将-Xms和-Xmx参数设置为相同值,以此防止在每次垃圾回收后对堆内存大小进行调整。堆内存中的对象,则由一个名为垃圾回收器的自动内存管理系统负责回收。

在CPU数量不足8台的情况下,该参数的数值等同于CPU的数量;以我的2核CPU服务器为例,此参数可以不设置。完成配置并启动服务后,观察到内存容量确实有所减少,从原先的500M降至100至200M,但这并非我所期待的结果;我期望内存能降至几十M的水平。

通过在网络上广泛查阅资料,我发现这项新技术能够满足我的需求。然而,需要注意的是,这项技术正经历快速更新迭代,变化频繁,因此建议仅用于个人学习研究,不宜应用于实际生产。

项目使用 后:

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

运行期间内存占用更少,官方公布的包含Boot、MVC等组件的镜像文件,其大小仅为50MB。

为了实现既定的目标,所需的构建周期相对较长——即便是简单的“Hello World”项目,构建过程也需耗时约两分钟,这一时间主要受限于计算机的性能配置,以我的设备为例intellij idea golang plugin,大约需要2分钟。

是什么

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

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

为了支持原生映像编译器将应用程序编译成原生可执行文件,提供beta级别的帮助,从而实现通常打包于轻量级容器中的原生部署方案。实际上,我们的目标是确保在这个新平台上,几乎无需修改的Boot应用程序也能得到良好的支持。

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

近年来,“原生”一词在云计算、边缘计算等众多领域频繁出现,与之紧密相连的编程语言,如Rust等,同样备受推崇。Java凭借其在上世纪流行的一次性编译、跨平台执行的特点,至今仍广受欢迎。然而,正因这一特性,Java程序往往需要依赖JVM运行环境,因此相较于原生程序,其吸引力有所减弱。当前云原生技术广泛应用的背景下,Java应用程序因搭载庞大的JVM而显得格外沉重,众多技术高手纷纷探索各种途径,力求使Java更加贴近“原生”特性。

intellij idea golang plugin_ Spring Boot 构建原生应用程序 _Spring Native 内存优化

实战

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

 Spring Boot 构建原生应用程序 _Spring Native 内存优化 _intellij idea golang plugin

从官方文档得知(上图)

该应用程序在编译时需采用 Java 11 或 Java 17 版本。

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

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

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

在经历了一系列的挫折之后,我成功在本机上应用了方法一和方法二。概括来说:

在步骤.3之后,我们可通过运用-boot-maven-插件来构建镜像,通过执行mvn -boot:build-image命令并借助相应的API来完成Boot原生应用程序的构建。一旦成功执行,便会自动生成一个镜像。接下来,只需运行该镜像即可,无需我们另行编写代码。所有相关的参数配置均已在pom.xml文件中进行设定(位于该插件的标签之下,与-maven-配置相似)。

无需安装,但需先行安装特定软件,完成安装后,通过执行mvn命令,即可生成一个可执行文件(.exe),运行该文件即可。

主要区别如下

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

鉴于各个微服务采用部署而非exe文件的形式,故而第一种方法恰好满足了我的要求;因此,在后续内容中,我将采用Boot模式来构建Boot原生应用。

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

官方下载地址:

https://www..org//

 Spring Boot 构建原生应用程序 _intellij idea golang plugin_Spring Native 内存优化

 Spring Boot 构建原生应用程序 _Spring Native 内存优化 _intellij idea golang plugin

2 配置环境变量

Spring Native 内存优化 _ Spring Boot 构建原生应用程序 _intellij idea golang plugin

 Spring Boot 构建原生应用程序 _intellij idea golang plugin_Spring Native 内存优化

Spring Native 内存优化 _intellij idea golang plugin_ Spring Boot 构建原生应用程序

关于方法1,观察前述三幅图似乎仅需调整设置即可,若希望一次性获得成功,建议同时调整三者,之后可根据需要进行自主测试。

检验是否安装成功

Spring Native 内存优化 _intellij idea golang plugin_ Spring Boot 构建原生应用程序

3 安装-image

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

gu install native-image

这一尝试未能成功,其解决方案在于需手动下载'image'文件,接着进行解压与安装操作。

禁止访问该网站,具体路径为“/ce-”后面跟着“/vm-21.3.0/”,再接着是“/image--svm---amd64-21.3.0.jar”。

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

intellij idea golang plugin_Spring Native 内存优化 _ Spring Boot 构建原生应用程序

在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”,这是XML Schema实例的引用。
         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>Spring框架下的实验性模块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>请访问https://repo.spring.io/release,该链接指向的是Spring项目的发布版仓库。url>
        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。这仅仅是一个基础的配置示例,而在实际的开发过程中,我们还需在-boot-maven-插件的标签内设置众多额外的参数。

对于远程地址、证书路径、JVM调优参数、配置文件设置、镜像名称、端口以及仓库地址等,最有效的做法是查阅-boot-maven-的官方指南。以下以配置JVM参数为例。

Spring Native 内存优化 _ Spring Boot 构建原生应用程序 _intellij idea golang plugin

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

<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>

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

官方文档:

请勿访问该链接,以避免进入文档中关于构建镜像的2.6.2版Maven指南页面。

6 执行maven命令

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

完成相关依赖的下载后,电脑的散热风扇便开始嗡嗡作响,通过任务管理器观察,CPU的使用率达到了满载状态,即100%,而内存的使用量也急剧上升,最终稳定在90%以上。

构建成功

Spring Native 内存优化 _intellij idea golang plugin_ Spring Boot 构建原生应用程序

7 创建并运行容器

查看所有镜像

Spring Native 内存优化 _intellij idea golang plugin_ Spring Boot 构建原生应用程序

-就是构建的镜像

创建并运行容器

在浏览日志时,我注意到应用已顺利启动,启动过程迅速,耗时仅短短几毫秒,这确实验证了启动速度属于毫秒级的说法。

intellij idea golang plugin_ Spring Boot 构建原生应用程序 _Spring Native 内存优化

成功调用接口

Spring Native 内存优化 _intellij idea golang plugin_ Spring Boot 构建原生应用程序

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

intellij idea golang plugin_Spring Native 内存优化 _ Spring Boot 构建原生应用程序

不使用 启动应用

Spring Native 内存优化 _intellij idea golang plugin_ Spring Boot 构建原生应用程序

intellij idea golang plugin_Spring Native 内存优化 _ Spring Boot 构建原生应用程序

启动耗时3s,占用内存高达511Mintellij idea golang plugin,高下立判。

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

版权声明:本文内容源自网络,原作者享有著作权。若非明确无法追溯,我们将注明作者和来源。若内容涉及侵权,敬请告知,我们承诺将迅速处理并致以诚挚歉意。愿所有读者享有愉悦的阅读体验!感谢您的支持!

长按解锁更多精彩

如有侵权请联系删除!

13262879759

微信二维码