<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
native image
是GraalVM中提供的一個命令,可以把位元組碼檔案或Jar包編譯成為一個二進位制可執行檔案,同時它自己也是用Java語言開發的(實現了Java的語言自舉)。
native image
在編譯時,可能會執行類中的某些程式碼,比如給類中的static屬性賦值(正常來說應該時執行時才去賦值的,現在是編譯時可能就被賦值了,這裡說的編譯不是javac)。
通常,在Java中,一個類在第一次被使用時才會進行初始化,但是我們使用native image
時就有可能直接進行類的初始化,我們把這個機制叫做build-time initialized,而二進位制可執行檔案在執行時,即便是第一次使用這個類時也都不會觸發類的初始化了。
預設情況下native image
是不會執行編譯期類初始化的,我們可以通過兩種方式來在編譯時觸發類的初始化:
native-image
時傳入--initialize-at-build-time=<class>
native image
會把常用的JDK中的類在編譯時進行初始化,比如java.lang.String
,java.util.**
,等等。
編譯期類的初始化是一個專業特徵,並不是所有類都適合。
請看下面的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原本的方式編譯並執行:
javac HelloWorld.java java HelloWorld Greeter is getting ready! Hello, World!
然後,我們把它編譯為一個本地可執行檔案,然後執行這個檔案:
native-image HelloWorld =============================================================== GraalVM Native Image: Generating 'helloworld' (executable)... ================================================================ ... Finished generating 'helloworld' in 14.9s.
./helloworld Greeter is getting ready! Hello, World!
我們發現,上述兩個過程都是在執行時才會對HelloWorld類進行初始化,所以預設情況下不會進行類的初始化。
我們通過新增--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!
我們發現Greeter is getting ready!
是在編譯時列印出來的,而真正在執行時由於HelloWorld類已經被初始化了,所以就沒有再初始化了。而在編譯時類初始化過程中被賦值的靜態屬性,會儲存在二進位制可執行檔案中的image heap中。
Native Image heap也可以叫做image heap,它包含了:
可以通過編譯時類初始化把一個物件放入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執行:
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類的初始化在編譯期被執行了,並且會建立一個String物件賦值給message屬性,並且把它存進了image heap中,執行的時候就直接從image heap中拿出來用了,忽略了執行時指定的-Dmessage
native image
在執行時,會先進行靜態分析,靜態分析會掃描出當前應用程式中真正用到了哪些類、方法、屬性(其實通常我們一個應用中很多類,特別是依賴的第三方Jar包中的類,是沒有被應用程式使用的),這些元素稱之為reachable code。
靜態分析包含兩個部分:
只有可達元素才能包含到二進位制可執行檔案中,一個二進位制可執行檔案編譯出來後,執行過程中就不能再有新元素被新增進去了,比如動態類載入,我們把這個叫做closed-world。
官網原文 https://www.graalvm.org/latest/reference-manual/native-image/basics/
以上就是GraalVM系列Native Image Basics靜態分析的詳細內容,更多關於GraalVM Native Image Basics的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45