成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

構建第一個GraalVM應用鏡像,體驗毫秒級極速啟動!

開發 前端
GraalVM使用其Ahead-Of-Time(AOT)編譯器將Java應用程序編譯為機器可執行文件。這些可執行文件可以直接在目標機器上執行,而無需使用即時編譯器(JIT)。

介紹

GraalVM使用其Ahead-Of-Time(AOT)編譯器將Java應用程序編譯為機器可執行文件。這些可執行文件可以直接在目標機器上執行,而無需使用即時編譯器(JIT)。GraalVM生成的二進制文件體積較小,啟動速度快,并且在沒有任何預熱的情況下提供最佳性能。此外,這些可執行文件的內存占用和CPU使用率低于在JVM上運行的應用程序。

Docker允許我們將軟件組件打包成Docker鏡像,并作為Docker容器運行。Docker容器包含應用程序運行所需的一切,包括應用代碼、運行時、系統工具和庫。

在本文中,我們創建一個Java應用程序的GraalVM原生鏡像,并將其作為Docker容器運行。

什么是原生鏡像?

原生鏡像是一種將Java代碼提前編譯成本地可執行文件的技術。這個本地可執行文件只包含在運行時需要執行的代碼,包括應用程序類、標準庫類、語言運行時以及來自JDK的靜態鏈接的本機代碼。

原生鏡像構建器(native-image)掃描應用程序類和其他元數據,來創建特定于操作系統和架構的二進制文件。native-image工具對應用程序代碼進行靜態分析,確定在應用程序運行時可達到的類和方法。然后,它將所需的類、方法和資源編譯成一個二進制可執行文件。

原生鏡像的好處

原生鏡像可執行文件具有以下幾個優點:

  • 由于原生鏡像構建器僅編譯運行時所需的資源,因此可執行文件較小。
  • 原生可執行文件具有非常快的啟動時間,因為它們在目標機器上直接執行,而無需使用JIT編譯器。
  • 由于只打包所需的應用程序資源,提供了較小的被攻擊面。
  • 適用于打包到輕量級容器鏡像(例如Docker鏡像)中,以實現快速高效的部署。

構建GraalVM原生鏡像

在本節中,我們將為一個Spring Boot應用程序構建一個GraalVM原生鏡像。首先,需要安裝GraalVM并設置JAVA_HOME環境變量。其次,創建一個帶有Spring Web和GraalVM原生支持依賴的Spring Boot應用程序:

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

還需要添加以下插件以支持GraalVM原生鏡像:

<build>
    <plugins>
        <plugin>
            <groupId>org.graalvm.buildtools</groupId>
            <artifactId>native-maven-plugin</artifactId>
            <version>0.9.27</version>
        </plugin>
    </plugins>
</build>

該應用程序包含一個REST Controller 示例:

@RestController
class HelloController {
	
    @GetMapping
    public String hello() {
	    return "Hello GraalVM";
    }
}

使用Maven命令構建原生可執行文件:

$mvn -Pnative native:compile

使用native-maven-plugin構建GraalVM原生鏡像。由于GraalVM原生鏡像編譯器執行靜態代碼分析,與常規的Java應用程序編譯相比,構建時間較長。

以下是GraalVM編譯的輸出示例:

========================================================================================================================
GraalVM Native Image: Generating 'springboot-graalvm-docker' (executable)...
========================================================================================================================
<strong>[1/8] Initializing... (42.7s @ 0.15GB)</strong>
Java version: 17.0.8+9-LTS, vendor version: Oracle GraalVM 17.0.8+9.1
Graal compiler: optimization level: 2, target machine: x86-64-v3, PGO: ML-inferred
C compiler: gcc (linux, x86_64, 11.3.0)
Garbage collector: Serial GC (max heap size: 80% of RAM)

// 省略不重要日志

<strong>[2/8] Performing analysis... [******] (234.6s @ 1.39GB)</strong>
15,543 (90.25%) of 17,222 types reachable
25,854 (67.59%) of 38,251 fields reachable
84,701 (65.21%) of 129,883 methods reachable
4,906 types, 258 fields, and 4,984 methods registered for reflection
64 types, 70 fields, and 55 methods registered for JNI access
4 native libraries: dl, pthread, rt, z
[3/8] Building universe... (14.7s @ 2.03GB)
[4/8] Parsing methods... [*******] (55.6s @ 2.05GB)
[5/8] Inlining methods... [***] (4.9s @ 2.01GB)
[6/8] Compiling methods... [**********
[6/8] Compiling methods... [*******************] (385.2s @ 3.02GB)
[7/8] Layouting methods... [****] (14.0s @ 2.00GB)
[8/8] Creating image... [*****] (30.7s @ 2.72GB)
48.81MB (58.93%) for code area: 48,318 compilation units
30.92MB (37.33%) for image heap: 398,288 objects and 175 resources
3.10MB ( 3.75%) for other data
82.83MB in total

// 省略不重要日志

Finished generating 'springboot-graalvm-docker' in 13m 7s.

// 省略不重要日志

在上述編譯輸出中需要關注一些關鍵點,如下:

  • 編譯使用GraalVM的Java編譯器來編譯應用程序。
  • 編譯器對類型、字段和方法進行可達性檢查。
  • 然后編譯構建原生可執行文件,并顯示可執行文件的大小和編譯所花費的時間。
  • 成功構建后,我們可以在目標目錄中找到原生可執行文件。該可執行文件可以在命令行中執行。

構建Docker鏡像

接下來為前一步生成的原生可執行文件開發一個Docker鏡像。

創建一個Dockerfile:

FROM ubuntu:jammy
COPY target/springboot-graalvm-docker /springboot-graalvm-docker
CMD ["/springboot-graalvm-docker"]

接下來,使用如下命令構建Docker鏡像:

$docker build -t springboot-graalvm-docker .

成功構建后,可以看到`springboot-graalvm-docker`的Docker鏡像已經可以使用了:

$docker images | grep springboot-graalvm-docker

可以使用以下命令執行這個鏡像:

$docker run -p 8080:8080 springboot-graalvm-docker

上述命令啟動了容器,Spring Boot的啟動日志如下:

// 省略不重要日志
***  INFO 1 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization <strong>completed in 14 ms</strong>
***  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
***  INFO 1 --- [           main] c.b.g.GraalvmDockerImageApplication      : Started GraalvmDockerImageApplication in 0.043 seconds (process running for 0.046)

應用程序在43毫秒內啟動。我們可以訪問REST端點:

$curl localhost:8080

輸出如下:

Hello GraalVM


責任編輯:華軒 來源: 今日頭條
相關推薦

2018-08-22 17:32:45

2013-01-14 09:44:58

JavaScriptJSJS框架

2015-04-15 11:28:04

Apple Watch殺手應用

2010-07-30 14:58:06

Flex應用

2012-02-08 11:15:38

HibernateJava

2021-04-07 13:38:27

Django項目視圖

2018-11-08 13:53:15

Flink程序環境

2023-05-19 08:49:58

SQLAlchemy數據庫

2014-12-24 11:34:23

CoreOSWordPress集群部署

2020-11-13 07:08:51

Spring Boot應用Spring

2021-04-03 12:31:48

Python開發數據科學

2018-01-31 15:45:07

前端Vue.js組件

2010-12-07 16:53:43

商業智能

2011-06-08 10:24:38

Windows Pho 應用程序

2009-05-13 09:20:12

Google App 應用收費

2011-06-08 10:01:36

Windows Pho 應用程序

2015-04-01 14:40:26

Java構建工具build.xml

2023-09-21 22:43:17

Django框架

2015-05-19 17:02:07

應用交付深信服

2013-06-14 17:16:44

WP開發Windows PhoWP應用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久国产精品 | 国产精品69久久久久水密桃 | 欧美一区二区三区 | 在线免费国产 | 自拍偷拍第一页 | 欧美一级欧美三级在线观看 | 免费麻豆视频 | 欧美日韩在线一区二区三区 | 天堂一区在线观看 | 国产成人99久久亚洲综合精品 | 日本午夜一区二区三区 | 丁香五月缴情综合网 | 91在线 | 亚洲精品在线免费 | a国产一区二区免费入口 | 国产91在线播放 | 国产午夜精品理论片a大结局 | 国产日韩免费视频 | 成人精品久久日伦片大全免费 | 九九热这里只有精品6 | 日韩中文字幕一区 | 一区二区免费在线观看 | 久久久久久国产 | 欧美激情亚洲天堂 | 伊人久久大香线 | 三级av在线 | 日韩欧美不卡 | 91麻豆精品国产91久久久久久久久 | 亚洲成人午夜电影 | 精品国产18久久久久久二百 | 91看片视频 | 97国产精品 | 成人久久视频 | 天天精品在线 | 欧美一区二区三区视频 | 中文区中文字幕免费看 | 久久久久亚洲精品 | 操视频网站 | 日韩精品 电影一区 亚洲 | 国产精品一区二区日韩 | 欧美另类视频在线 |