在熟悉了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的常规使用相关推荐

  1. ART、JIT、AOT、Dalvik之间有什么关系?

    2019独角兽企业重金招聘Python工程师标准>>> JIT与Dalvik JIT是"Just In Time Compiler"的缩写,就是"即时编 ...

  2. JIT编译和AOT编译

    JIT(just in time) 实时编译,即时编译. Profile-Based Optimization,边跑边优化,根据运行时信息然后随着时间的推移得到尽可能优化的代码,适用于开发调试. AO ...

  3. JVM 虚拟机 AOT 和 JIT 即时编译

    文章目录 JVM 虚拟机 AOT 和 JIT 即时编译 1.AOT 2.JIT JVM 虚拟机 AOT 和 JIT 即时编译 1.AOT AOT 是 Ahead Of Time ,运行前编译 与 JI ...

  4. 对比JIT和AOT,各自的优点与缺点

    编译器和解释器是什么 编译器和解释器的区别在于是否编译和执行过程是否是同时进行. 编译器所干的事,将一门语言 X 编译为另一门语言 Y (可以是语言 X.高级语言.低级语言等),整个编译过程涉及词法分 ...

  5. 运行代码后总是会出现很多的的debug [main请问如何解决_Flutter的Hot Reload是如何做到的...

    众所周知,在Flutter 应用的Debug模式下,当我们开启[Hot Reload]功能时,不需要在重启应用即可看到最新的代码效果.这种类似于RN.Weex和小程序的热加载功能是如何做到的呢,它背后 ...

  6. 【Xamarin挖墙脚系列:Xamarin.IOS机制原理剖析】

    [注意:]团队里总是有人反映卸载Xamarin,清理不完全.之前写过如何完全卸载清理剩余的文件.今天写了Windows下的批命令,MAC下的Shell脚本. Windows 批: echo 'plea ...

  7. TensorFlow技术内幕(八):模型优化之XLA(下)

    上一章我们分析了XLA在TensofFlow中的两种调用方式AOT和JIT,本章分析XLA编译器的实现. LLVM 提到编译器就不得不提大名鼎鼎的LLVM.LLVM是一个编译器框架,由C++语言编写而 ...

  8. 区间最值操作与历史最值问题(一)

    前言 本文主要讲解一种叫做 SegmentTreeBeatsSegmentTree~BeatsSegmentTree Beats 的维护区间取最值操作的问题,以及维护区间历史最值的方法.本文参考自许多 ...

  9. 《深入理解JVM 第三版》 读书笔记

    2 Java内存区域与内存溢出异常 2.2 运行时数据区域 2.2.1程序计数器 程序计数器占用空间较小,可以看作当前 线程执行字节码的行号.因此是线程独立的. 如果执行的是native方法,则该计数 ...

最新文章

  1. activiti 工作流_技术干货 | 金仓通用数据库中,如何使用Activiti快速开发工作流应用?...
  2. 微软系统遭*** 谴责人为失误
  3. 红黑树:自平衡的二叉查找树
  4. 皮一皮:一直情绪不稳的原因终于找到了!
  5. windows比linux差在哪,怎么让新手理解Linux比Windows好在哪里!
  6. 【开源项目----Android OPenGLES渲染YUV视频文件】
  7. CSS3 Flex 弹性布局用法详解
  8. php redis decr,Redis Decr 命令
  9. winhex搜索中的偏移问题?请高手指点
  10. 主机字节序和网络字节序(大端序,小端序,网络序)
  11. 安卓bin固件文件编辑器_通刷版魔百盒九联UNT401H海思Hi3798MV310芯片红外蓝牙语音遥控免拆及强刷固件及刷机教程202009版...
  12. 形式语言与自动机第三课
  13. 学习日志-《微习惯》笔记
  14. 网络安全之数据加密和数字签名技术
  15. 本地数据库迁移至服务器数据库的教程
  16. 基于 Verilog 的经典数字电路设计(1)加法器
  17. pandas筛选数据_2_条件筛选
  18. 【数据分析师-数据分析项目案例三】多因素房价预测分析案例
  19. 年份必须是4位数 C语言,输入年份(四位数),判断是否是闰年 C语言编程
  20. STM32F407 USB虚拟双串口

热门文章

  1. 递归二分查找时间复杂度、空间复杂度和稳定性
  2. Fabric--测试链码
  3. 2020-11-7(http协议简介)
  4. 【网络安全】简要分析下Chrome-V8-Issue-762874
  5. leetcode 最长公共前缀
  6. Windows消息机制学习笔记(三)—— 消息的接收与分发
  7. 查看进程命令+关闭进程
  8. 1.3 继承(extends)
  9. 将Calendar对象转换为日期时间字符串
  10. mysql command line client和mysql.exe输入密码后闪退问题解决方法