php使用aot,aot的常规使用
在熟悉了aot的一些基本操作以及一些使用模式后,我們看看常規(guī)的操作是怎么樣的。
對核心類庫編譯
java核心類庫可以說是調(diào)用比較頻繁的代碼,所以把核心類庫進(jìn)行編譯,可以有效的提升啟動速度。
jaotc --output libjava.base.so --module java.base
一般情況下,jdk是保證了核心類庫的編譯是沒有問題的。上面的指令除非用的預(yù)覽版本,那都是正常的。
合理設(shè)置參數(shù)
jaotc可以使用-J指定運(yùn)行時(shí)參數(shù),官方的例子中使用了gc參數(shù)和壓縮指針參數(shù)。
jaotc -J-XX:-UseCompressedOops --output libtest.so AotTest.class
如果運(yùn)行時(shí)沒有-XX:-UseCompressedOops日志中會打印出一個(gè)異常。
Shared file ./libtest.so error: UseCompressedOops has different value 'false' from current 'true'
832 1 skipped ./libtest.so aot library
gc的也同理。
哪些運(yùn)行時(shí)參數(shù)是必須編譯時(shí)就設(shè)置的,這個(gè)我自己測試了-Xmx這些,是可以運(yùn)行的。現(xiàn)在發(fā)現(xiàn)的其實(shí)就是那兩個(gè)參數(shù),這個(gè)只能說實(shí)踐中慢慢確認(rèn)了。
這里也就是出現(xiàn)了一個(gè)問題,我們的程序不一定都要用G1,有的也需要使用ps,堆小的是需要開啟壓指針的,堆大的確實(shí)不需要。針對這種情況,我們能做的就是把情況和組合枚舉一下,然后編譯出多個(gè)版本,啟動的時(shí)候指定不同的版本,官方就推薦這么做的,甚至他還舉了例子。
-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
應(yīng)該慶幸參數(shù)可能就這么少,如果運(yùn)行時(shí)特別多的話,編譯起來估計(jì)要瘋的,得寫腳本做循環(huán)遍歷。然后用的時(shí)候得按照規(guī)則加載出合適的庫,大部分時(shí)間都花在了腳本匹配上了,而且還得打開-XX:+PrintAOT,這個(gè)錯(cuò)誤并不會讓程序失敗停止。還需要做日志分析。所以說這個(gè)用起來確認(rèn)正確性還真是一個(gè)麻煩的事情。
aot與反射
我寫了一個(gè)比較簡單的demo,發(fā)現(xiàn)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");
}
}
我們把兩個(gè)class文件打到一個(gè)庫里。
jaotc --output libtest.so AotTest.class TestB.class
執(zhí)行我們看到,TestB也是可以正常執(zhí)行的。
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);
}
沿用上面的例子,加了一個(gè)lambda。我們看看結(jié)果。
$ 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
我們發(fā)現(xiàn)lambda也是可以正常運(yùn)行的。
總結(jié)
以上的案例都是基于jdk11做的,相比9剛出aot的時(shí)候,支持力度更好,基本的反射以及l(fā)ambda都是可以正常運(yùn)行。
總結(jié)
以上是生活随笔為你收集整理的php使用aot,aot的常规使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php 多文件上传控件,php 动态多文
- 下一篇: php switch 函数,PHP丨PH