php使用aot,aot的常规使用
在熟悉了aot的一些基本操作以及一些使用模式后,我們看看常規的操作是怎么樣的。
對核心類庫編譯
java核心類庫可以說是調用比較頻繁的代碼,所以把核心類庫進行編譯,可以有效的提升啟動速度。
jaotc --output libjava.base.so --module java.base
一般情況下,jdk是保證了核心類庫的編譯是沒有問題的。上面的指令除非用的預覽版本,那都是正常的。
合理設置參數
jaotc可以使用-J指定運行時參數,官方的例子中使用了gc參數和壓縮指針參數。
jaotc -J-XX:-UseCompressedOops --output libtest.so AotTest.class
如果運行時沒有-XX:-UseCompressedOops日志中會打印出一個異常。
Shared file ./libtest.so error: UseCompressedOops has different value 'false' from current 'true'
832 1 skipped ./libtest.so aot library
gc的也同理。
哪些運行時參數是必須編譯時就設置的,這個我自己測試了-Xmx這些,是可以運行的。現在發現的其實就是那兩個參數,這個只能說實踐中慢慢確認了。
這里也就是出現了一個問題,我們的程序不一定都要用G1,有的也需要使用ps,堆小的是需要開啟壓指針的,堆大的確實不需要。針對這種情況,我們能做的就是把情況和組合枚舉一下,然后編譯出多個版本,啟動的時候指定不同的版本,官方就推薦這么做的,甚至他還舉了例子。
-XX:-UseCompressedOops -XX:+UseG1GC : libjava.base.so
-XX:+UseCompressedOops -XX:+UseG1GC : libjava.base-coop.so
-XX:-UseCompressedOops -XX:+UseParallelGC : libjava.base-nong1.so
-XX:+UseCompressedOops -XX:+UseParallelGC : libjava.base-coop-nong1.so
應該慶幸參數可能就這么少,如果運行時特別多的話,編譯起來估計要瘋的,得寫腳本做循環遍歷。然后用的時候得按照規則加載出合適的庫,大部分時間都花在了腳本匹配上了,而且還得打開-XX:+PrintAOT,這個錯誤并不會讓程序失敗停止。還需要做日志分析。所以說這個用起來確認正確性還真是一個麻煩的事情。
aot與反射
我寫了一個比較簡單的demo,發現aot是支持反射的。
import java.lang.reflect.Field;
public class AotTest {
public static void main(String[] args) throws Exception {
Class> testB=Class.forName("TestB");
Field fields = testB.getDeclaredField("SS");
fields.setAccessible(true);
String ss = (String) fields.get(null);
System.out.println(ss);
}
}
public class TestB{
private final static String SS="ggg";
public static void main(String[] args) {
System.out.println("this is TestB");
}
}
我們把兩個class文件打到一個庫里。
jaotc --output libtest.so AotTest.class TestB.class
執行我們看到,TestB也是可以正常執行的。
java -XX:+PrintAOT -XX:AOTLibrary=./libtest.so AotTest
747 1 loaded ./libtest.so aot library
828 1 aot[ 1] AotTest.()V
828 2 aot[ 1] AotTest.main([Ljava/lang/String;)V
828 3 aot[ 1] TestB.()V
828 4 aot[ 1] TestB.main([Ljava/lang/String;)V
ggg
aot與lambda
import java.lang.reflect.Field;
public class AotTest {
public static void main(String[] args) throws Exception {
Class> testB=Class.forName("TestB");
Field fields = testB.getDeclaredField("SS");
fields.setAccessible(true);
String ss = (String) fields.get(null);
System.out.println(ss);
MathOperation addition = (int a, int b) -> a + b;
addition.operation(1, 2);
}
}
interface MathOperation {
int operation(int a, int b);
}
沿用上面的例子,加了一個lambda。我們看看結果。
$ java -XX:+PrintAOT -XX:AOTLibrary=./libtest.so AotTest
673 1 loaded ./libtest.so aot library
752 1 aot[ 1] AotTest.lambda$main$0(II)I
752 2 aot[ 1] AotTest.()V
752 3 aot[ 1] AotTest.main([Ljava/lang/String;)V
753 4 aot[ 1] TestB.()V
753 5 aot[ 1] TestB.main([Ljava/lang/String;)V
ggg
我們發現lambda也是可以正常運行的。
總結
以上的案例都是基于jdk11做的,相比9剛出aot的時候,支持力度更好,基本的反射以及lambda都是可以正常運行。
總結
以上是生活随笔為你收集整理的php使用aot,aot的常规使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 多文件上传控件,php 动态多文
- 下一篇: oracle 取第三大的值,Oracle