为了账号安全,请及时绑定邮箱和手机立即绑定

初识aot

标签:
Java

aot介绍

aot是Ahead-Of-Time的缩写,以前大家都知道java的一个定位就是半编译,半解释型语言。他把java文件编译成class文件,最后jvm解释执行class文件,jvm可以把class文件解释为对应的机器码,这个就是靠的jit。aot则是直接把class文件编译系统的库文件,不在依靠jit去做这个事情。

demo环境

要求 版本
系统 macos
java jdk11
本地编译 xcode11

这里提到了系统和编译器。可以说写c需要什么,这里就需要准备什么,简单点的话,最好准备和系统配套的编译器,减少编译的坑。

java代码


public class AotTest{
    public static void main(String[] args) {
        System.out.println("first aot");
    }
}

平平无奇,和我们普通写java一样。
编译java文件

 javac AotTest.java

平平无奇,和我们平时编译也没区别。
开始编译成本地库

jaotc --output libtest.so AotTest.class

jaotc是jdk提供的编译成本地库的方式。他和java一样,在bin目录下,如果配置了环境变量,是可以执行的。
如果系统和编译器匹配,这里就是一把过。最终会在本地生成libtest.so的文件。
开始执行

 java -XX:AOTLibrary=./libtest.so AotTest

编译成本地库,我们也还是要指定一下main的类,这个和以前java -cp执行没有区别。

first aot

不出意外可以执行方法。
你一定也发现了,这个操作很繁琐,这还是一个文件,要是编译出来的class特别多,怎么办。而且还没有管理的工程文件。
这点jdk已经帮我们想到了。

 jaotc
Usage: jaotc <options> list

  list       A : separated list of class names, modules, jar files
             or directories which contain class files.

where options include:
  --output <file>            Output file name
  --class-name <class names> List of classes to compile
  --jar <jarfiles>           List of jar files to compile
  --module <modules>         List of modules to compile
  --directory <dirs>         List of directories where to search for files to compile
  --search-path <dirs>       List of directories where to search for specified files
  --compile-commands <file>  Name of file with compile commands
  --compile-for-tiered       Generate profiling code for tiered compilation
  --compile-with-assertions  Compile with java assertions
  --compile-threads <number> Number of compilation threads to be used
  --ignore-errors            Ignores all exceptions thrown during class loading
  --exit-on-error            Exit on compilation errors
  --info                     Print information during compilation
  --verbose                  Print verbose information
  --debug                    Print debug information
  -? -h --help               Print this help message
  --version                  Version information
  --linker-path              Full path to linker executable
  -J<flag>                   Pass <flag> directly to the runtime system

查看帮助文档,发现他支持的扫描方式多种多样,最简单的方式,我们依旧使用maven编译,最后打成的jar包。通过–jar参数来生成库文件。

aot的优势

java发展这么多年了,大家也没有感觉jit有什么不好的,为什么还要加入aot呢。
我们如果对比jit和aot,可以发现一些区别,就是aot已经编译成本地代码了,不用再靠jvm进行解释执行,这样省去了jvm的解释时间。换句话说启动更快了。
启动更快的这个需求,可以说是伴随云原生的。我们设想以下的场景。web服务进行促销业务,结果发现流量比预期的多,刚来时就达到了警戒线,因为是突发,所以增长速度要比原来快。此时启动一个程序花了5s,那么就得有5s的风险去承担流量冲击,很可能把服务冲垮了,如果1s就可以启动成功,那么风险就会大大减小。
aot肯定不完全都是好的,跨平台的特性首选去除了。其次aot最终运行效果是不如jit的。jit因为在运行时进行分析,所以更好的了解程序的运行,aot则不能,所以启动更快,但是巅峰的运行速度,可能是略差与jit的。并且为了编译成功,依赖的jar包必须都全部在,例如编译A,那么A依赖的库必须都在,否则编译会失败,反射,aop等动态的特性都会有问题。A依赖B里的一个逻辑,B的方法里依赖了C,jit只有在方法调用的时候才会触发类加载等,A调用的方法里不用C,C是可以不加入的。但是编译成本地库则不能,不管用不用,依赖就得在。

小结

  • 利用aot我们可以获取更快的启动速度
  • 可以省去jvm的运行时的分析
  • 但是编译的条件非常的多,限制也非常的多。
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
1.6万
获赞与收藏
380

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消