最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Native實(shí)現(xiàn)0.059s啟動(dòng)一個(gè)SpringBoot項(xiàng)目

 更新時(shí)間:2024年02月12日 09:01:41   作者:Hello.Reader  
Spring Native是Spring框架的一個(gè)子項(xiàng)目,旨在提供一種將Spring應(yīng)用程序編譯為本地可執(zhí)行文件的方法,從而提高啟動(dòng)時(shí)間和資源效率,本文主要介紹了Spring Native實(shí)現(xiàn)0.059s啟動(dòng)一個(gè)SpringBoot項(xiàng)目,感興趣的可以了解一下

前言

最近自己用Spring Cloud Alibaba做了一個(gè)微服務(wù)架構(gòu)的項(xiàng)目,部署的時(shí)候遇到了難題:內(nèi)存不夠。目前該項(xiàng)目有7個(gè)微服務(wù),因?yàn)槲抑挥幸慌_(tái)阿里云的服務(wù)器(2C 4G),所以我只能把所有的微服務(wù)部署在一臺(tái)服務(wù)器上,部署方式是使用docker制作springboot的fat jar鏡像,每個(gè)微服務(wù)在不加任何JVM調(diào)優(yōu)參數(shù)的情況下所占內(nèi)存約500M。

由于是微服務(wù)所以肯定還要部署:nacos,除此之外還用到了redis、sentinel、rocketmq、elk等(mysql買(mǎi)的阿里云的),光是運(yùn)行這些應(yīng)用就占用內(nèi)存2個(gè)多G,剩下的1個(gè)多G內(nèi)存在部署4個(gè)微服務(wù)后就滿(mǎn)了,于是開(kāi)始對(duì)springboot應(yīng)用的內(nèi)存進(jìn)行初步優(yōu)化:

添加JVM參數(shù)優(yōu)化內(nèi)存大小

# JVM初始分配的內(nèi)存由-Xms指定,默認(rèn)是物理內(nèi)存的1/64
-Xms128m
# JVM最大分配的內(nèi)存由-Xmx指定,默認(rèn)是物理內(nèi)存的1/4
-Xmx128m
# 規(guī)定了每個(gè)線(xiàn)程虛擬機(jī)棧及堆棧的大小,一般情況下,256k是足夠的,此配置將會(huì)影響此進(jìn)程中并發(fā)線(xiàn)程數(shù)的大小。
-Xss256k
# 指定并行GC線(xiàn)程的數(shù)量,一般最好和CPU核心數(shù)量相當(dāng)
-XX:ParallelGCThreads=2

默認(rèn)空余堆內(nèi)存小于40%時(shí),JVM就會(huì)增大堆直到-Xmx的最大限制;空余堆內(nèi)存大于70%時(shí),JVM會(huì)減少堆直到 -Xms的最小限制。

因此服務(wù)器一般設(shè)置-Xms、-Xmx相等以避免在每次GC 后調(diào)整堆的大小。對(duì)象的堆內(nèi)存由稱(chēng)為垃圾回收器的自動(dòng)內(nèi)存管理系統(tǒng)回收。

默認(rèn)情況下,當(dāng) CPU 數(shù)量小于8, ParallelGCThreads 的值等于 CPU 數(shù)量,我的服務(wù)器是2C的所以這個(gè)參數(shù)可省略。配置完成后,啟動(dòng)服務(wù)發(fā)現(xiàn)內(nèi)存確實(shí)變小了,由原來(lái)的500M降至100~200M,但不是我想要的效果,我期望的效果是達(dá)到幾十M的級(jí)別。

經(jīng)網(wǎng)上查閱大量資料得知可以使用Spring Native這門(mén)新技術(shù)來(lái)實(shí)現(xiàn)我的需求。(該技術(shù)正處于快速迭代階段,變動(dòng)較大,建議用于個(gè)人學(xué)習(xí),不要用于生產(chǎn))

SpringBoot項(xiàng)目使用Spring Native后:

  • 應(yīng)用啟動(dòng)速度特別快,毫秒級(jí)別
  • 運(yùn)行時(shí)更低的內(nèi)存消耗,官方展示的含有Spring Boot, Spring MVC, Jackson, Tomcat的鏡像大小是50M
  • 為了達(dá)到前面的效果,代價(jià)是構(gòu)建時(shí)間更長(zhǎng)(即使是一個(gè)Hello Word構(gòu)建也需要2分鐘,不過(guò)主要取決于電腦配置,我的是2min左右)

Spring Native是什么

簡(jiǎn)而言之就是為了提高Java在云原生的競(jìng)爭(zhēng)力(個(gè)人理解)。

以下內(nèi)容摘抄自GitHub上Spring Native的自述文件:

Spring Native 為使用GraalVM 原生映像編譯器將 Spring 應(yīng)用程序編譯為原生可執(zhí)行文件提供 beta
支持,以提供通常設(shè)計(jì)為打包在輕量級(jí)容器中的原生部署選項(xiàng)。實(shí)際上,目標(biāo)是在這個(gè)新平臺(tái)上支持幾乎未修改的 Spring Boot 應(yīng)用程序。

以下內(nèi)容摘抄自其他博客:

近幾年“原生”一詞一直泛濫在云計(jì)算、邊緣計(jì)算等領(lǐng)域中,而原生寵幸的語(yǔ)言也一直都是Golang,Rust等脫離Sandbox運(yùn)行的開(kāi)發(fā)語(yǔ)言。Java得益于上世紀(jì)流行的一次編譯,到處執(zhí)行的理念,流行至今,但也因?yàn)檫@個(gè)原因,導(dǎo)致Java程序脫離不了JVM運(yùn)行環(huán)境,使得不那么受原生程序的青睞。在云原生泛濫的今天,臃腫的JVM使Java應(yīng)用程序?qū)Ρ绕渌Z(yǔ)言顯得無(wú)比的龐大,各路大神也想了很多方式讓Java變的更“原生”。

在這里插入圖片描述

實(shí)戰(zhàn)

本次實(shí)戰(zhàn)相關(guān)的環(huán)境信息如下:

  • OS:Windows10 21H1
  • IDE:IntelliJ IDEA 2021.2.3
  • JDK:graalvm-ce-java11-21.3.0
  • Maven:3.6.3
  • Docker Desktop for Windows: 20.10.12
  • Spring Boot:2.6.2
  • Spring Native:0.11.1

    在這里插入圖片描述

    從官方文檔得知(上圖)

使用 Spring Native 的應(yīng)用程序應(yīng)該使用 Java 11 或 Java 17 編譯。

構(gòu)建 Spring Boot 原生應(yīng)用程序有兩種主要方法:

使用Spring Boot Buildpacks 支持生成包含本機(jī)可執(zhí)行文件的輕量級(jí)容器。

使用GraalVM 原生鏡像 Maven 插件支持生成原生可執(zhí)行文件。

經(jīng)過(guò)各種踩坑后在本機(jī)上成功的使用了方法1和方法2。簡(jiǎn)單來(lái)說(shuō):

方法1就是在SpringBoot2.3后,可以使用spring-boot-maven-plugin插件來(lái)構(gòu)建docker鏡像,使用mvn spring-boot:build-image命令結(jié)合Docker的API來(lái)實(shí)現(xiàn)Spring Boot 原生應(yīng)用程序的構(gòu)建,成功執(zhí)行后會(huì)直接生成一個(gè)docker鏡像,然后run這個(gè)鏡像就可以了,不用我們?cè)賹?xiě)Dockerfile了,相關(guān)的參數(shù)配置都在pom.xml中配置(該插件的configuration標(biāo)簽下,和fabric8或spotify的docker-maven-plugin很相似)。

方法2不需要安裝docker,但要安裝Visual Studio,然后執(zhí)行mvn -Pnative package命令后會(huì)生成一個(gè)可執(zhí)行文件(.exe),運(yùn)行即可。

主要區(qū)別如下

1 環(huán)境依賴(lài)不同

  • 方法1需要安裝Docker
  • 方法2需要安裝Visual Studio(需要用到部分單個(gè)組件:2個(gè)MSVC,1個(gè)Windows 10 SDK)

2 執(zhí)行的maven命令不同

  • 方法1是mvn spring-boot:build-image
  • 方法2是mvn -Pnative package

因?yàn)槊總€(gè)微服務(wù)使用Docker部署而不是exe文件,所以方法1正好符合我的需求,所以后文使用Spring Boot Buildpacks的方式構(gòu)建Spring Boot原生應(yīng)用程序。

安裝Graal VM(graalvm-ce-java11-windows-amd64)

官方下載地址:

https://www.graalvm.org/downloads/

在這里插入圖片描述

在這里插入圖片描述

配置環(huán)境變量

在這里插入圖片描述

在這里插入圖片描述

針對(duì)方法1的話(huà),上面三張圖好像只用配置JAVA_HOME就行,想一次成功的話(huà)建議3個(gè)都配,后續(xù)可以自行測(cè)試。

檢驗(yàn)是否安裝成功

在這里插入圖片描述

安裝native-image

打開(kāi)新的cmd,輸入以下命令,等待安裝

gu install native-image

這一步我執(zhí)行失敗了,解決方法就是從github上手動(dòng)下載native-image,然后解壓、安裝

https://github.com/graalvm/graalvm-ce-builds/releases/download/vm-21.3.0/native-image-installable-svm-java11-windows-amd64-21.3.0.jar

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

在這里插入圖片描述

在bin目錄下打開(kāi)cmd,輸入以下命令,等待安裝

$ gu install -L native-image*

安裝 Desktop for Windows

具體步驟略,按照官方文檔操作即可:

https://docs.docker.com/desktop/windows/install/

配置pom.xml

前面都是準(zhǔn)備工作,這一步開(kāi)始才是重點(diǎn)

首先快速創(chuàng)建一個(gè)Spring Boot項(xiàng)目,我命名為spring-native

完整的pom如下

<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>ltd.pcdd</groupId>
    <artifactId>spring-native</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>spring-native</name>
    <description>spring-native</description>
    <properties>
        <java.version>11</java.version>
        <repackage.classifier/>
        <spring-native.version>0.11.1</spring-native.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.experimental</groupId>
            <artifactId>spring-native</artifactId>
            <version>${spring-native.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.experimental</groupId>
                <artifactId>spring-aot-maven-plugin</artifactId>
                <version>0.11.1</version>
                <executions>
                    <execution>
                        <id>generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!--Spring Boot 2.3發(fā)布后帶來(lái)了新特性之一就是對(duì)構(gòu)建鏡像的便捷支持-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <image>
                        <builder>paketobuildpacks/builder:tiny</builder>
                        <env>
                            <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
                        </env>
                    </image>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-release</id>
            <name>Spring release</name>
            <url>https://repo.spring.io/release</url>
        </repository>
    </repositories>

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

</project>

本文介紹的是Spring Native0.11.1版本,其對(duì)應(yīng)的Spring Boot版本必須是2.6.2,以上只是一個(gè)最基本的配置案例,實(shí)際開(kāi)發(fā)中還需要在spring-boot-maven-plugin插件的configuration標(biāo)簽下配置其他許許多多的參數(shù)。

例如docker遠(yuǎn)程的地址和證書(shū)的路徑、jvm調(diào)優(yōu)參數(shù)、配置文件指定、docker鏡像名端口倉(cāng)庫(kù)地址等等,最好的方法就是看spring-boot-maven-plugin的官方文檔,這里以配置jvm參數(shù)為例

在這里插入圖片描述

通過(guò)官方文檔得知只需要在configuration標(biāo)簽下配置即可,例如

<image>
 <builder>paketobuildpacks/builder:tiny</builder>
 <env>
  <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
  <BPE_DELIM_JAVA_TOOL_OPTIONS xml:space="preserve"> </BPE_DELIM_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-Xms128m</BPE_APPEND_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-Xmx128m</BPE_APPEND_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-Xss256k</BPE_APPEND_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:ParallelGCThreads=2</BPE_APPEND_JAVA_TOOL_OPTIONS>
  <BPE_APPEND_JAVA_TOOL_OPTIONS>-XX:+PrintGCDetails</BPE_APPEND_JAVA_TOOL_OPTIONS>
 </env>
</image>

其他的配置參數(shù)還有很多。

官方文檔:

https://docs.spring.io/spring-boot/docs/2.6.2/maven-plugin/reference/htmlsingle/#build-image

執(zhí)行maven命令

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

下載完相關(guān)依賴(lài)后,電腦風(fēng)扇就開(kāi)始呼呼的轉(zhuǎn),查看任務(wù)管理器發(fā)現(xiàn)CPU利用率100%,內(nèi)存使用量飆升,最后穩(wěn)定在90%+。

構(gòu)建成功

在這里插入圖片描述

創(chuàng)建并運(yùn)行容器

查看所有鏡像

在這里插入圖片描述

spring-native就是構(gòu)建的鏡像

創(chuàng)建并運(yùn)行容器

在這里插入圖片描述

在Docker Desktop查看日志,發(fā)現(xiàn)應(yīng)用成功啟動(dòng),啟動(dòng)僅耗時(shí)。,也就是59ms,果然印證了Spring Native啟動(dòng)是毫秒級(jí)別這句話(huà)。

在這里插入圖片描述

成功調(diào)用接口

在這里插入圖片描述

在Docker Desktop查看占用內(nèi)存,僅28M左右。

在這里插入圖片描述

不使用Spring Native啟動(dòng)應(yīng)用

在這里插入圖片描述

啟動(dòng)耗時(shí)3s,占用內(nèi)存高達(dá)511M,高下立判。

文章僅供參考,建議結(jié)合Spring Native官方最新文檔學(xué)習(xí)。

https://docs.spring.io/spring-native/docs/current/reference/htmlsingle/index.html

到此這篇關(guān)于Spring Native實(shí)現(xiàn)0.059s啟動(dòng)一個(gè)SpringBoot項(xiàng)目的文章就介紹到這了,更多相關(guān)Spring Native啟動(dòng)項(xiàng)目?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Java隨機(jī)密碼生成并和郵箱、手機(jī)號(hào)匹配

    Java隨機(jī)密碼生成并和郵箱、手機(jī)號(hào)匹配

    這篇文章主要介紹了Java隨機(jī)密碼生成并和郵箱、手機(jī)號(hào)匹配的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Java使用jdbc連接實(shí)現(xiàn)對(duì)MySQL增刪改查操作的全過(guò)程

    Java使用jdbc連接實(shí)現(xiàn)對(duì)MySQL增刪改查操作的全過(guò)程

    JDBC的全稱(chēng)是Java?Database?Connectivity,即Java數(shù)據(jù)庫(kù)連接,它是一種可以執(zhí)行SQL語(yǔ)句的Java?API,下面這篇文章主要給大家介紹了關(guān)于Java使用jdbc連接實(shí)現(xiàn)對(duì)MySQL增刪改查操作的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 分布式系統(tǒng)中的降級(jí)熔斷設(shè)計(jì)問(wèn)題面試

    分布式系統(tǒng)中的降級(jí)熔斷設(shè)計(jì)問(wèn)題面試

    這篇文章主要為大家介紹了分布式系統(tǒng)中的降級(jí)熔斷設(shè)計(jì)問(wèn)題面試解答,有需要的朋友可以借鑒參考下,希望能有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • idea如何實(shí)現(xiàn)引入外部jar包

    idea如何實(shí)現(xiàn)引入外部jar包

    文章介紹了如何在idea軟件中添加自定義jar依賴(lài):打開(kāi)idea,進(jìn)入項(xiàng)目依賴(lài),選擇模塊,點(diǎn)擊+號(hào)選擇JARs of directories,找到并選擇jar文件,勾選并應(yīng)用更改,最后在項(xiàng)目依賴(lài)中確認(rèn)jar文件已成功引入
    2025-11-11
  • Java中最基本的存儲(chǔ)單元之變量基礎(chǔ)教程

    Java中最基本的存儲(chǔ)單元之變量基礎(chǔ)教程

    變量相當(dāng)于內(nèi)存中一個(gè)數(shù)據(jù)存儲(chǔ)空間的表示,類(lèi)似與門(mén)牌號(hào)與房間的關(guān)系—變量看作門(mén)牌號(hào),通過(guò)門(mén)牌號(hào)可以找到房間,而通過(guò)變量名可以訪(fǎng)問(wèn)到變量,這篇文章主要介紹了Java中最基本的存儲(chǔ)單元之變量基礎(chǔ)教程的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • SpringBoot之統(tǒng)一數(shù)據(jù)返回格式的實(shí)現(xiàn)示例

    SpringBoot之統(tǒng)一數(shù)據(jù)返回格式的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot之統(tǒng)一數(shù)據(jù)返回格式的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12
  • jpa介紹以及在spring boot中使用詳解

    jpa介紹以及在spring boot中使用詳解

    最近在項(xiàng)目中使用了一下jpa,發(fā)現(xiàn)還是挺好用的。這里就來(lái)講一下jpa以及在spring boot中的使用。在這里我們先來(lái)了解一下jpa,希望能給你帶來(lái)幫助
    2021-08-08
  • 我們來(lái)說(shuō)說(shuō)Java LockSupport 的 park 和 unpark

    我們來(lái)說(shuō)說(shuō)Java LockSupport 的 park 和 unpa

    LockSupport是JDK底層線(xiàn)程阻塞工具,通過(guò)park/unpark實(shí)現(xiàn)線(xiàn)程阻塞與喚醒,避免死鎖,與Object的wait/notify相比,無(wú)需監(jiān)視器,支持先unpark后park,且更精確控制線(xiàn)程狀態(tài),是AQS等同步器的核心基礎(chǔ),本文介紹Java LockSupport 的 park 和 unpark,感興趣的朋友一起看看吧
    2025-07-07
  • Java實(shí)現(xiàn)發(fā)起HTTP請(qǐng)求的四種方法實(shí)現(xiàn)與適用場(chǎng)景

    Java實(shí)現(xiàn)發(fā)起HTTP請(qǐng)求的四種方法實(shí)現(xiàn)與適用場(chǎng)景

    Java中發(fā)起HTTP請(qǐng)求有多種方式,包括原生庫(kù)、第三方庫(kù)及現(xiàn)代API,以下是常見(jiàn)的幾種實(shí)現(xiàn)方法,本文介紹了它們的具體實(shí)現(xiàn)代碼以及性能適用場(chǎng)景,感興趣的可以了解下
    2025-06-06
  • MyBatis Mapper中 @Select注解調(diào)用靜態(tài)常量的問(wèn)題分析

    MyBatis Mapper中 @Select注解調(diào)用靜態(tài)常量的問(wèn)題分析

    在Java編碼中,我們通常會(huì)把這些數(shù)字或者字符串定義在常量類(lèi)或者接口中,可以直接在mapper中也可以使用這些常量就比較好,這篇文章主要介紹了MyBatis Mapper中 @Select注解調(diào)用靜態(tài)常量,需要的朋友可以參考下
    2023-06-06

最新評(píng)論

竹北市| 天津市| 浦县| 包头市| 尼勒克县| 台北市| 江华| 调兵山市| 宁蒗| 洱源县| 十堰市| 延庆县| 通辽市| 萍乡市| 正安县| 山西省| 潜江市| 鄄城县| 巴林右旗| 荆州市| 双柏县| 大荔县| 喀什市| 平度市| 榕江县| 商南县| 黔西县| 无极县| 安康市| 专栏| 华池县| 临西县| 什邡市| 庆云县| 武宣县| 防城港市| 江阴市| 潮州市| 佛坪县| 海阳市| 南陵县|