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

詳解Spring?boot?GraalVM?原生鏡像支持

 更新時(shí)間:2025年12月22日 10:51:04   作者:猩火燎猿  
GraalVM?Native?Image?是?GraalVM?提供的?ahead-of-time?(AOT)?編譯工具,可以將?Java?應(yīng)用編譯為本地可執(zhí)行文件,跳過(guò)?JVM?啟動(dòng)和?JIT?編譯階段,達(dá)到“秒級(jí)啟動(dòng)”和低內(nèi)存占用的效果,本文介紹Spring?boot?GraalVM?原生鏡像支持詳解,感興趣的朋友一起看看吧

1. 什么是 GraalVM Native Image?

GraalVM Native Image 是 GraalVM 提供的 ahead-of-time (AOT) 編譯工具,可以將 Java 應(yīng)用編譯為本地可執(zhí)行文件,跳過(guò) JVM 啟動(dòng)和 JIT 編譯階段,達(dá)到“秒級(jí)啟動(dòng)”和低內(nèi)存占用的效果。

2. Spring Boot 對(duì) GraalVM 的支持

  • Spring Boot 3.x 及以上原生支持 GraalVM Native Image(依賴 Spring Framework 6+)。
  • 提供了 spring-boot-maven-plugin 的 native image 構(gòu)建支持。
  • Spring Native(Spring Boot 2.x 的原生支持項(xiàng)目)已合并進(jìn)主線,不再單獨(dú)維護(hù)。

3. 基本依賴和配置

3.1 依賴

確保使用 Spring Boot 3.x 及以上版本:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

3.2 插件配置(以 Maven 為例)

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>3.2.0</version>
    <executions>
        <execution>
            <goals>
                <goal>build-image</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <image>
            <builder>paketobuildpacks/builder:tiny</builder>
            <env>
                <BP_NATIVE_IMAGE>true</BP_NATIVE_IMAGE>
            </env>
        </image>
    </configuration>
</plugin>

或者用 Gradle:

bootBuildImage {
    builder = 'paketobuildpacks/builder:tiny'
    environment = ['BP_NATIVE_IMAGE':'true']
}

3.3 安裝 GraalVM

  • 推薦 GraalVM 22.3+,JDK 17/21,下載地址:https://www.graalvm.org/
  • 安裝 native-image 工具(GraalVM 22.3+ 直接內(nèi)置)
gu install native-image

4. 構(gòu)建原生鏡像

4.1 直接用 Spring Boot 插件構(gòu)建容器鏡像

./mvnw spring-boot:build-image -Pnative

./gradlew bootBuildImage --imageName=myapp:latest

4.2 直接生成本地原生二進(jìn)制

./mvnw native:compile

或用 Gradle:

./gradlew nativeCompile

生成的二進(jìn)制位于 target/ 或 build/native/nativeCompile/ 目錄下。

5. 運(yùn)行原生鏡像

./target/myapp

或者用 Docker 鏡像運(yùn)行:

docker run -p 8080:8080 myapp:latest

6. 原理簡(jiǎn)述

  • AOT 編譯:Spring Boot 3.x 在構(gòu)建階段做了大量靜態(tài)分析,移除不必要的反射、動(dòng)態(tài)代理、類加載等,生成 AOT 代碼。
  • Native Image:GraalVM 將所有類、依賴、資源、配置打包成單一可執(zhí)行文件,極大減少啟動(dòng)時(shí)的類加載和初始化。

7. 常見(jiàn)限制與注意事項(xiàng)

  • 反射:GraalVM 默認(rèn)不支持動(dòng)態(tài)反射。Spring Boot 3.x 的 AOT 處理會(huì)自動(dòng)注冊(cè)大部分反射元數(shù)據(jù),但如果你用到自定義反射、動(dòng)態(tài)代理、JNI 等,需要手動(dòng)配置反射元數(shù)據(jù)(見(jiàn)下)。
  • 動(dòng)態(tài)類加載:不支持。
  • JDK 動(dòng)態(tài)特性:如 MethodHandle、Unsafe、動(dòng)態(tài)字節(jié)碼等需謹(jǐn)慎使用。
  • 第三方庫(kù)兼容性:部分庫(kù)不支持原生鏡像,要查閱兼容性列表。

8. 反射、資源等元數(shù)據(jù)配置

如果自動(dòng)分析無(wú)法識(shí)別,可以手動(dòng)添加元數(shù)據(jù)文件:

  • src/main/resources/META-INF/native-image/ 下放置
    • reflect-config.json(反射)
    • resource-config.json(資源)
    • jni-config.json
    • proxy-config.json

示例 reflect-config.json

[
  {
    "name": "com.example.MyClass",
    "allDeclaredConstructors": true,
    "allDeclaredMethods": true,
    "allDeclaredFields": true
  }
]

9. 性能與調(diào)優(yōu)

  • 啟動(dòng)速度:通常小型應(yīng)用可達(dá)幾十毫秒啟動(dòng)。
  • 內(nèi)存占用:顯著降低,適合微服務(wù)、Serverless。
  • CPU/吞吐量:原生鏡像一般低于 JVM 模式(無(wú) JIT 優(yōu)化),適合對(duì)啟動(dòng)和內(nèi)存敏感的場(chǎng)景。

調(diào)優(yōu)建議:

  • 只引入必要依賴,減少反射與動(dòng)態(tài)特性
  • 使用 Spring Boot 3.x 推薦的編程模式
  • 定期關(guān)注 Spring 官方和 GraalVM 的文檔更新

10. 常見(jiàn)問(wèn)題答疑

Q1:應(yīng)用啟動(dòng)報(bào)錯(cuò),找不到某些類?
A:多為反射未注冊(cè),需手動(dòng)補(bǔ)充 reflect-config.json。

Q2:第三方庫(kù)支持情況?
A:查看 Spring Native hints 或 GraalVM 官方文檔。

Q3:如何調(diào)試原生鏡像?
A:可用 -H:GenerateDebugInfo=1 生成帶調(diào)試信息的鏡像。

Q4:原生鏡像性能不如 JVM?
A:原生鏡像主要優(yōu)勢(shì)是啟動(dòng)速度和內(nèi)存,長(zhǎng)期運(yùn)行高吞吐場(chǎng)景仍建議 JVM。

11.進(jìn)階構(gòu)建方式

1.1 直接使用 GraalVM native-image 命令

如果你需要更細(xì)致的控制(自定義參數(shù)、調(diào)試、手動(dòng)優(yōu)化等),可以直接用 native-image 命令:

# 首先編譯你的 Spring Boot 項(xiàng)目為 fat jar
./mvnw clean package
# 使用 native-image 構(gòu)建原生可執(zhí)行文件
native-image \
  -jar target/demo-0.0.1-SNAPSHOT.jar \
  --no-fallback \
  --enable-http \
  --enable-https \
  --report-unsupported-elements-at-runtime \
  -H:Name=demo-native

常用參數(shù)說(shuō)明:

  • --no-fallback:不生成 JVM fallback 鏡像,強(qiáng)制原生。
  • --report-unsupported-elements-at-runtime:遇到不支持的代碼報(bào)錯(cuò)而不是靜默跳過(guò)。
  • -H:Name=xxx:生成的可執(zhí)行文件名。
  • -H:ConfigurationFileDirectories=...:指定元數(shù)據(jù)(反射、資源等)目錄。

1.2 Docker 多階段構(gòu)建

如果你希望在 CI/CD、云環(huán)境下自動(dòng)化構(gòu)建,可以用 Docker 多階段:

FROM ghcr.io/graalvm/graalvm-community:latest AS graalvm
WORKDIR /app
COPY target/demo-0.0.1-SNAPSHOT.jar .
RUN native-image -jar demo-0.0.1-SNAPSHOT.jar --no-fallback -H:Name=app
FROM debian:bullseye-slim
WORKDIR /app
COPY --from=graalvm /app/app .
EXPOSE 8080
ENTRYPOINT ["./app"]

12.原生鏡像與 Spring Boot 生態(tài)集成

12.1 Spring Cloud

Spring Cloud 2022.0+ 部分組件已支持原生鏡像,但如動(dòng)態(tài)配置、某些注冊(cè)中心(Eureka、Consul)等需關(guān)注兼容性。
建議使用 Spring Cloud 官方推薦的 starter 版本,并查閱兼容性列表

12.2 Spring Security

常見(jiàn)的認(rèn)證方式如 JWT、OAuth2 已有原生支持,但自定義的過(guò)濾器、動(dòng)態(tài)授權(quán)建議用 AOT hints 補(bǔ)充反射元數(shù)據(jù)。

12.3 數(shù)據(jù)庫(kù)訪問(wèn)(JPA/MyBatis)

  • JPA/Hibernate 6+ 已支持原生鏡像,但復(fù)雜的動(dòng)態(tài)查詢、反射用法需補(bǔ)充 hints。
  • MyBatis 需關(guān)注 XML 映射文件、反射調(diào)用,建議用注解式 Mapper。
  • 推薦使用 Spring Data JDBC、R2DBC 等更輕量的方式。

13.元數(shù)據(jù)自動(dòng)生成與調(diào)試

13.1 使用 Spring AOT hints

Spring Boot 3.x 的 AOT 編譯會(huì)自動(dòng)收集大部分元數(shù)據(jù),但如果你用到自定義反射或第三方庫(kù),建議用 @NativeHint 或 @TypeHint 注解:

@TypeHint(types = MyClass.class, access = {TypeAccess.DECLARED_CONSTRUCTORS, TypeAccess.DECLARED_METHODS})
public class MyService {}

13.2 自動(dòng)生成元數(shù)據(jù)工具

GraalVM 支持運(yùn)行時(shí)追蹤生成元數(shù)據(jù):

java -agentlib:native-image-agent=config-output-dir=src/main/resources/META-INF/native-image \
  -jar target/demo-0.0.1-SNAPSHOT.jar

然后在開(kāi)發(fā)環(huán)境運(yùn)行關(guān)鍵路徑,收集 reflect/resource/proxy-config.json,后續(xù) native-image 構(gòu)建時(shí)自動(dòng)加載。

14.常見(jiàn)問(wèn)題排查與解決

14.1 啟動(dòng)報(bào)錯(cuò)(ClassNotFoundException/NoSuchMethodError)

  • 檢查 reflect-config.json 是否覆蓋了相關(guān)類。
  • 檢查第三方依賴是否有原生支持。
  • 可用 --verbose 參數(shù)查看 native-image 構(gòu)建日志。

14.2 資源文件找不到

  • 檢查 resource-config.json 是否包含所需資源。
  • 確保資源路徑正確,原生鏡像不支持動(dòng)態(tài)路徑查找。

14.3 日志、監(jiān)控集成

  • 推薦使用 Micrometer、Prometheus、OpenTelemetry 等已支持原生鏡像的監(jiān)控工具。
  • 日志建議用 Logback、Log4j2 的原生兼容版本。

15.性能調(diào)優(yōu)建議

  • 精簡(jiǎn)依賴,避免引入不必要的反射/動(dòng)態(tài)代理類庫(kù)。
  • 配置合適的 JVM 參數(shù)(如 max heap),雖然原生鏡像不需要 JVM,但部分參數(shù)仍影響內(nèi)存分配。
  • 用 -H:+PrintAnalysisCallTree 追蹤構(gòu)建分析,優(yōu)化代碼結(jié)構(gòu)。

16.原生鏡像與容器化/Serverless

  • 原生鏡像極適合 K8s、FaaS(如 AWS Lambda、阿里云函數(shù)計(jì)算)等 Serverless 環(huán)境。
  • 鏡像體積小,冷啟動(dòng)快,資源利用率高。
  • 可結(jié)合 Buildpacks、Docker、云原生工具鏈自動(dòng)化部署。

17.原生鏡像的局限與未來(lái)

  • 復(fù)雜反射/字節(jié)碼生成場(chǎng)景仍有限制。
  • 生態(tài)兼容性提升中,建議關(guān)注 Spring 官方和 GraalVM 的 release note。
  • Spring Boot 3.x 及 GraalVM 23+ 已大幅提升易用性和兼容性,未來(lái)會(huì)越來(lái)越友好。

總結(jié)

  • Spring Boot 3.x 原生支持 GraalVM Native Image
  • 提供極快啟動(dòng)和低內(nèi)存,適合云原生/Serverless
  • 需關(guān)注反射、動(dòng)態(tài)代理等限制,必要時(shí)補(bǔ)充元數(shù)據(jù)
  • 構(gòu)建和運(yùn)行簡(jiǎn)單,生態(tài)日趨成熟

到此這篇關(guān)于詳解Spring boot GraalVM 原生鏡像支持詳解的文章就介紹到這了,更多相關(guān)Spring boot GraalVM 原生鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java使用httpclient 發(fā)送請(qǐng)求的示例

    java使用httpclient 發(fā)送請(qǐng)求的示例

    HttpClient 是Apache Jakarta Common 下的子項(xiàng)目,可以用來(lái)提供高效的、最新的、功能豐富的支持 HTTP 協(xié)議的客戶端編程工具包,并且它支持 HTTP 協(xié)議最新的版本和建議,這篇文章主要介紹了java使用httpclient 發(fā)送請(qǐng)求的示例,需要的朋友可以參考下
    2023-10-10
  • SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實(shí)現(xiàn)

    SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot中干掉Whitelabel Error Page返回自定義內(nèi)容的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Mybatis初始化知識(shí)小結(jié)

    Mybatis初始化知識(shí)小結(jié)

    Mybatis的初始化過(guò)程就是加載自己運(yùn)行時(shí)所需要的配置信息的過(guò)程,這篇文章主要介紹了Mybatis初始化知識(shí)小結(jié),需要的朋友可以參考下
    2021-10-10
  • Java基礎(chǔ)篇之HashMap指定初始值

    Java基礎(chǔ)篇之HashMap指定初始值

    這篇文章主要給大家介紹了關(guān)于Java基礎(chǔ)篇之HashMap指定初始值的相關(guān)資料,HashMap是Java中常用的數(shù)據(jù)結(jié)構(gòu),它提供了高效的鍵值對(duì)存儲(chǔ)和查詢功能,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • 基于springboot攔截器HandlerInterceptor的注入問(wèn)題

    基于springboot攔截器HandlerInterceptor的注入問(wèn)題

    這篇文章主要介紹了springboot攔截器HandlerInterceptor的注入問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 深入剖析構(gòu)建JSON字符串的三種方式(推薦)

    深入剖析構(gòu)建JSON字符串的三種方式(推薦)

    下面小編就為大家?guī)?lái)一篇深入剖析構(gòu)建JSON字符串的三種方式(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Java 實(shí)現(xiàn)聲音播放程序

    Java 實(shí)現(xiàn)聲音播放程序

    這篇文章主要介紹了Java 實(shí)現(xiàn)聲音播放程序的示例代碼,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • Spring詳解四種加載配置項(xiàng)的方法

    Spring詳解四種加載配置項(xiàng)的方法

    這篇文章主要給大家介紹了關(guān)于springboot加載配置項(xiàng)的四種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用springboot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-06-06
  • Java使用Tinify實(shí)現(xiàn)圖片無(wú)損壓縮(4M無(wú)損壓縮到1M)的方法

    Java使用Tinify實(shí)現(xiàn)圖片無(wú)損壓縮(4M無(wú)損壓縮到1M)的方法

    在當(dāng)今的數(shù)字化時(shí)代,圖片已成為網(wǎng)站、應(yīng)用和社交媒體中不可或缺的元素,然而,大尺寸的圖片不僅會(huì)增加頁(yè)面或者客戶端加載時(shí)間,還會(huì)占用大量的存儲(chǔ)空間,本文將詳細(xì)介紹如何利用Tinify壓縮圖片,并將其上傳至OSS,重點(diǎn)介紹圖片壓縮實(shí)現(xiàn)方式,需要的朋友可以參考下
    2024-08-08
  • 出現(xiàn)java.util.ConcurrentModificationException 問(wèn)題及解決辦法

    出現(xiàn)java.util.ConcurrentModificationException 問(wèn)題及解決辦法

    這篇文章主要介紹了出現(xiàn)java.util.ConcurrentModificationException 問(wèn)題及解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-02-02

最新評(píng)論

女性| 温泉县| 溆浦县| 松潘县| 内丘县| 彭阳县| 淅川县| 裕民县| 崇文区| 宁明县| 海城市| 修文县| 西昌市| 蓝田县| 永吉县| 绍兴市| 双峰县| 漳浦县| 安庆市| 洞头县| 平定县| 台安县| 永丰县| 广汉市| 洪江市| 清苑县| 方山县| 山东| 湖口县| 沁阳市| 辉南县| 宿迁市| 富顺县| 剑阁县| 西吉县| 哈尔滨市| 平远县| 古丈县| 慈溪市| 宜章县| 深圳市|