日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php使用aot,aot的常规使用

發布時間:2025/3/20 php 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的常规使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。