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

GraalVM系列Native?Image?Basics靜態(tài)分析

 更新時(shí)間:2023年02月06日 16:29:07   作者:Hoeller  
這篇文章主要為大家介紹了GraalVM系列Native?Image?Basics靜態(tài)分析詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

native image是GraalVM中提供的一個(gè)命令,可以把字節(jié)碼文件或Jar包編譯成為一個(gè)二進(jìn)制可執(zhí)行文件,同時(shí)它自己也是用Java語言開發(fā)的(實(shí)現(xiàn)了Java的語言自舉)。

Build Time vs Run Time

native image在編譯時(shí),可能會(huì)執(zhí)行類中的某些代碼,比如給類中的static屬性賦值(正常來說應(yīng)該時(shí)運(yùn)行時(shí)才去賦值的,現(xiàn)在是編譯時(shí)可能就被賦值了,這里說的編譯不是javac)。

通常,在Java中,一個(gè)類在第一次被使用時(shí)才會(huì)進(jìn)行初始化,但是我們使用native image時(shí)就有可能直接進(jìn)行類的初始化,我們把這個(gè)機(jī)制叫做build-time initialized,而二進(jìn)制可執(zhí)行文件在運(yùn)行時(shí),即便是第一次使用這個(gè)類時(shí)也都不會(huì)觸發(fā)類的初始化了。

默認(rèn)情況下native image是不會(huì)執(zhí)行編譯期類初始化的,我們可以通過兩種方式來在編譯時(shí)觸發(fā)類的初始化:

  • 在執(zhí)行native-image時(shí)傳入--initialize-at-build-time=<class>
  • 在一個(gè)能編譯時(shí)初始化的類中去使用其他的類

native image會(huì)把常用的JDK中的類在編譯時(shí)進(jìn)行初始化,比如java.lang.String,java.util.**,等等。

編譯期類的初始化是一個(gè)專業(yè)特征,并不是所有類都適合。

請(qǐng)看下面的Demo加深理解:

public class HelloWorld {
    static class Greeter {
        static {
            System.out.println("Greeter is getting ready!");
        }
        public static void greet() {
          System.out.println("Hello, World!");
        }
    }
  public static void main(String[] args) {
    Greeter.greet();
  }
}

使用Java原本的方式編譯并運(yùn)行:

javac HelloWorld.java
java HelloWorld 
Greeter is getting ready!
Hello, World!

然后,我們把它編譯為一個(gè)本地可執(zhí)行文件,然后執(zhí)行這個(gè)文件:

native-image HelloWorld
===============================================================
GraalVM Native Image: Generating 'helloworld' (executable)...
================================================================
...
Finished generating 'helloworld' in 14.9s.
./helloworld 
Greeter is getting ready!
Hello, World!

我們發(fā)現(xiàn),上述兩個(gè)過程都是在運(yùn)行時(shí)才會(huì)對(duì)HelloWorld類進(jìn)行初始化,所以默認(rèn)情況下不會(huì)進(jìn)行類的初始化。

我們通過添加--initialize-at-build-time=HelloWorld\$Greeter來看看編譯期類初始化是怎樣的:

native-image HelloWorld --initialize-at-build-time=HelloWorld\$Greeter
======================================================================
GraalVM Native Image: Generating 'helloworld' (executable)...
======================================================================
Greeter is getting ready!
...
Finished generating 'helloworld' in 13.6s.
./helloworld 
Hello, World!

我們發(fā)現(xiàn)Greeter is getting ready!是在編譯時(shí)打印出來的,而真正在運(yùn)行時(shí)由于HelloWorld類已經(jīng)被初始化了,所以就沒有再初始化了。而在編譯時(shí)類初始化過程中被賦值的靜態(tài)屬性,會(huì)保存在二進(jìn)制可執(zhí)行文件中的image heap中。

Native Image Heap

Native Image heap也可以叫做image heap,它包含了:

  • 在編譯時(shí)創(chuàng)建出來的對(duì)象
  • 在二進(jìn)制文件中使用到的類對(duì)象(Class對(duì)象)
  • 嵌入在方法中的對(duì)象常量

可以通過編譯時(shí)類初始化把一個(gè)對(duì)象放入image heap中:

class Example {
    private static final String message;
    static {
        message = System.getProperty("message");
    }
    public static void main(String[] args) {
        System.out.println("Hello, World! My message is: " + message);
    }
}

正常用java運(yùn)行:

javac Example.java
java -Dmessage=hi Example
Hello, World! My message is: hi
java -Dmessage=hello Example 
Hello, World! My message is: hello
java Example
Hello, World! My message is: null

而如果使用編譯期類初始化:

native-image Example --initialize-at-build-time=Example -Dmessage=native
========================================================================
GraalVM Native Image: Generating 'example' (executable)...
========================================================================
...
Finished generating 'example' in 19.0s.
./example 
Hello, World! My message is: native
./example -Dmessage=aNewMessage
Hello, World! My message is: native

Example類的初始化在編譯期被執(zhí)行了,并且會(huì)創(chuàng)建一個(gè)String對(duì)象賦值給message屬性,并且把它存進(jìn)了image heap中,運(yùn)行的時(shí)候就直接從image heap中拿出來用了,忽略了運(yùn)行時(shí)指定的-Dmessage

靜態(tài)分析

native image在執(zhí)行時(shí),會(huì)先進(jìn)行靜態(tài)分析,靜態(tài)分析會(huì)掃描出當(dāng)前應(yīng)用程序中真正用到了哪些類、方法、屬性(其實(shí)通常我們一個(gè)應(yīng)用中很多類,特別是依賴的第三方Jar包中的類,是沒有被應(yīng)用程序使用的),這些元素稱之為reachable code

靜態(tài)分析包含兩個(gè)部分:

  • 掃描一個(gè)方法的字節(jié)碼(比如main方法),找到它可達(dá)的其他元素
  • 從native image heap中的對(duì)象開始掃描,找到其他可達(dá)的元素

只有可達(dá)元素才能包含到二進(jìn)制可執(zhí)行文件中,一個(gè)二進(jìn)制可執(zhí)行文件編譯出來后,運(yùn)行過程中就不能再有新元素被添加進(jìn)去了,比如動(dòng)態(tài)類加載,我們把這個(gè)叫做closed-world。

官網(wǎng)原文  https://www.graalvm.org/latest/reference-manual/native-image/basics/

以上就是GraalVM系列Native Image Basics靜態(tài)分析的詳細(xì)內(nèi)容,更多關(guān)于GraalVM Native Image Basics的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • ArrayList?foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分析

    ArrayList?foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分

    這篇文章主要為大家介紹了ArrayList?foreach循環(huán)增添刪除導(dǎo)致ConcurrentModificationException解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2023-12-12
  • Java處理壓縮文件的步驟詳解

    Java處理壓縮文件的步驟詳解

    在Java編程環(huán)境中,處理zip壓縮文件是一項(xiàng)常見的任務(wù),特別是在數(shù)據(jù)傳輸、備份或者打包應(yīng)用程序時(shí),本文將詳細(xì)講解Java處理壓縮文件的步驟,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-10-10
  • Spring Cache實(shí)現(xiàn)緩存技術(shù)

    Spring Cache實(shí)現(xiàn)緩存技術(shù)

    在面對(duì)公司緩存技術(shù)混亂時(shí),張三基于Spring框架自研緩存解決方案,展現(xiàn)了他的專業(yè)技術(shù)能力和積極工作態(tài)度,他通過問題診斷、技術(shù)選型、編碼測(cè)試、文檔編寫和部署監(jiān)控等一系列步驟,確保了新緩存系統(tǒng)的功能正確性和性能穩(wěn)定性
    2024-10-10
  • Java流程控制之順序結(jié)構(gòu)

    Java流程控制之順序結(jié)構(gòu)

    Java中的流程控制語句可以這樣分類:順序結(jié)構(gòu),選擇結(jié)構(gòu),循環(huán)結(jié)構(gòu)。下面文章我們就來看看來順序結(jié)構(gòu)的詳細(xì)介紹,主要以順序結(jié)構(gòu)簡單圖示及詳細(xì)解說該內(nèi)容,需要的小伙伴可以參考一下
    2021-12-12
  • Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)

    Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)

    Hibernate想要實(shí)現(xiàn)雙向的關(guān)聯(lián)就必須在映射文件的兩端同時(shí)配置<one-to-one>,另外還要在主映射的一端采用foreign外鍵關(guān)聯(lián)屬性,下面我們就一起來看一下Java的Hibernate框架中的雙向主鍵關(guān)聯(lián)與雙向外鍵關(guān)聯(lián)方法:
    2016-06-06
  • Java語言實(shí)現(xiàn)簡單FTP軟件 FTP軟件效果圖預(yù)覽之下載功能(2)

    Java語言實(shí)現(xiàn)簡單FTP軟件 FTP軟件效果圖預(yù)覽之下載功能(2)

    這篇文章主要為大家詳細(xì)介紹了Java語言實(shí)現(xiàn)簡單FTP軟件,F(xiàn)TP軟件效果圖預(yù)覽之下載功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 使用profiles進(jìn)行多環(huán)境配置的代碼實(shí)現(xiàn)

    使用profiles進(jìn)行多環(huán)境配置的代碼實(shí)現(xiàn)

    在項(xiàng)目開發(fā)的過程中會(huì)用到多個(gè)環(huán)境,為了便于開發(fā)使用,通常需要使用profiles進(jìn)行多環(huán)境配置,所以本文給大家介紹了使用profiles進(jìn)行多環(huán)境配置的代碼實(shí)現(xiàn),需要的朋友可以參考下
    2024-02-02
  • Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證

    Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證

    在后端開發(fā)中,參數(shù)校驗(yàn)是非常普遍的,下面這篇文章主要給大家介紹了關(guān)于Java參數(shù)校驗(yàn)詳解之使用@Valid注解和自定義注解進(jìn)行參數(shù)驗(yàn)證的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Springboot實(shí)現(xiàn)發(fā)送郵件

    Springboot實(shí)現(xiàn)發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了Springboot實(shí)現(xiàn)發(fā)送郵件功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • 帶大家深入了解Spring事務(wù)

    帶大家深入了解Spring事務(wù)

    Spring框架提供統(tǒng)一的事務(wù)抽象,通過統(tǒng)一的編程模型使得應(yīng)用程序可以很容易地在不同的事務(wù)框架之間進(jìn)行切換. 在學(xué)習(xí)Spring事務(wù)前,我們先對(duì)數(shù)據(jù)庫事務(wù)進(jìn)行簡單的介紹。,需要的朋友可以參考下
    2021-05-05

最新評(píng)論

威宁| 龙井市| 涡阳县| 黄大仙区| 呼玛县| 德庆县| 乐山市| 凤庆县| 乌恰县| 岳池县| 泰来县| 静宁县| 陇南市| 虞城县| 内丘县| 云安县| 扎囊县| 宁都县| 蓬安县| 阿拉尔市| 腾冲县| 文昌市| 怀柔区| 上饶市| 茂名市| 嘉鱼县| 泾阳县| 左云县| 博爱县| 衡阳市| 元阳县| 潢川县| 重庆市| 隆安县| 南陵县| 集安市| 乌兰察布市| 柘城县| 河南省| 苏尼特左旗| 通道|