中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用aot的坑怎么解決

發布時間:2021-12-21 10:29:23 來源:億速云 閱讀:190 作者:iii 欄目:開發技術

本篇內容主要講解“使用aot的坑怎么解決”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“使用aot的坑怎么解決”吧!

啟動參數固定化

jaotc可以通過加-J參數來指定jvm的啟動參數。我們嘗試使用cms來編譯一下庫文件。

jaotc   -J-XX:+UseConcMarkSweepGC --output libtest.so AotTest.class

執行的結果會有兩條信息。

Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Error occurred during initialization of VM
JVMCI Compiler does not support selected GC: concurrent mark sweep gc

第一條是cms已經標記為廢棄。第二條是jvmci不支持cms。按照官方文檔上講,現在的aot支持ps和g1。其他的并不支持。我們下面試試ps,因為現在默認已經是g1了。

jaotc   -J-XX:+UseParallelGC --output libtest.so AotTest.class

發現是成功的。

啟動的參數需要固定化這也就是說你有兩種配置,就得先用jaotc去編譯出兩個版本的庫,在用的時候進行選擇。

編譯參數和啟動參數要一致

我們基于上面產生ps的libtest.so,我們嘗試換個啟動參數。

java  -XX:+UseConcMarkSweepGC -XX:AOTLibrary=./libtest.so AotTest
java  -XX:+UseParallelGC -XX:AOTLibrary=./libtest.so AotTest
java  -XX:+UseG1GC -XX:AOTLibrary=./libtest.so AotTest

你會發現上面三個啟動參數都會執行正確,并沒有報錯。是不是感覺違背了官方講的編譯和啟動一致的這個要求。這里介紹一個參數。

-XX:+PrintAOT

這個參數可以打出使用aot的klasses和method。我們下面再試試G1(庫是上面指定了ps的)。

java  -XX:+UseG1GC -XX:+PrintAOT -XX:AOTLibrary=./libtest.so AotTest

我們會發現有不一樣的輸出。

Shared file ./libtest.so error: used 'parallel gc' is different from current 'g1 gc'
     7    1     skipped ./libtest.so  aot library

這里會有一個錯誤提示,說libtest.so是使用了ps和現在用的g1不一樣。跳過了這個庫。然后對比一下ps的結果。

     12    1     loaded    ./libtest.so  aot library
   113    1     aot[ 1]   AotTest.<init>()V
   113    2     aot[ 1]   AotTest.main([Ljava/lang/String;)V

發現ps是可以打印出aot的方法的。

class文件是必須存在

我們既然編譯出可執行文件了,那么class文件是不是可以不要了呢。答案是不行的。我們下面用一個復雜一點的案例。

public class TestB{
public static void main(String[] args) {
System.out.println("this is TestB");
}
}

準備一個調用類。然后在另外一個文件里調用B。

public class AotTest{
   public static void main(String[] args) {
       TestB.main(null);
   }
}

我們這次把B單獨編譯成庫,依舊使用。

jaotc --output  libB.so TestB.class

現在刪除TestB.class,再次執行。我們發現會報下面的錯誤。

Exception in thread "main" java.lang.NoClassDefFoundError: TestB
at AotTest.main(AotTest.java:3)
Caused by: java.lang.ClassNotFoundException: TestB
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:581)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 1 more

直接是NoClassDefFoundError。

aot的理解

jvm的整體流程沒有變化,aot的存在是替換了jit的部分,并不代表所有的數據都在生成的二進制文件里。aot并不是把java變成了例如c那種的可執行文件,他只是不需要動態的編譯了,直接拿到現成的結果。

到此,相信大家對“使用aot的坑怎么解決”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

湖北省| 浙江省| 花莲县| 大姚县| 土默特右旗| 思茅市| 延川县| 弥渡县| 龙山县| 图们市| 芒康县| 内乡县| 宁波市| 南宫市| 东方市| 大连市| 海南省| 朝阳县| 株洲县| 雷波县| 通辽市| 嘉鱼县| 宜兰市| 苏尼特左旗| 屏山县| 措勤县| 华宁县| 清涧县| 浮山县| 延寿县| 双鸭山市| 邵阳县| 祥云县| 哈密市| 威宁| 尼勒克县| 枣强县| 两当县| 三穗县| 安阳县| 文化|