日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

php使用aot,aot的常规使用

發(fā)布時(shí)間:2025/3/20 65 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php使用aot,aot的常规使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在熟悉了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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。