关于对JIT和AOT特性的理解
面向对象语言性能较低的原因
- 将大部分的对象使用堆来进行存储,只有少数基本类型在栈中存放,而且堆得性能低于栈。
- 很多强制类型转换(cast)或加查,耗用内存大。java运行时对类型检测,如果类型不正确会抛出ClassCastException异常。
- 自动垃圾回收机制要耗用不少内存。
- 面向对象语言是半编译语言,最终的执行代码并不是可以直接进行编译的二进制机械码。
JIT和AOT
java文件的执行流程
上述过程源代码经javac编译成字节码.class文件,后经程序字节码经过JIT环境变量进行判断,是否属于“热点代码”(消耗大部分系统资源的一小部分的代码),最后通过JIT编译为具体硬件处理器(如sparc、intel)机器码。
优点:
1.通过在运行时收集监控信息,把"热点代码"(Hot Spot Code)编译成与本地平台相关的机器码,并进行各种层次的优化;
2.可以大大提高执行效率;
缺点:
1.收集监控信息影响程序运行;
2.编译过程占用程序运行时间(如使得启动速度变慢);
3.编译机器码占用内存;
JIT(运行时动态编译)
JIT(Just-in-time)即“即时编译”,指的是一句一句边翻译边运行,不产生目标程序。它将源语言(如BASIC和java得到的class字节码文件)书写的源程序作为输入,解释一句后就提交计算机执行一句,并不形成目标程序。就像外语 翻译中的“口译”一样,说一句翻一句,不产生全文的翻译文本。如在终端上打一条命令或语句,解释程序 就立即将此语句解释成一条或几条指令并提交硬件立即执行且将执行结果反映到终端,从终端把命令打入后,就能立即得到计算结果。
AOT(静态编译)
静态编译的程序在执行前全部被翻译为机器码,通常将这种类型称为AOT (Ahead of time)即 “提前编译”。它把高级语言源程序作为输入,进行翻译转换,产生出机器语言的目标程序,然后再让计算机去执行这个目标程序,得到计算结果。
JIT和AOT的比较:
JIT(Just in time:即时编译器、动态编译):
在运行是动态编译,可以只编译那些经常使用的方法(热方法),提高效率;其它的解释。
根据代码结构肯能提高或降低java程序执行速度。(代码结构好提高:某些情况下可比肩C++,不然降低)。
运行时进行本地代码编译而不是在程序运行前编译(C、C++是这种),保证了可移植性。
AOT(Ahead of time:提前编译、静态编译):
运行前编译好,缺点是全编译了,不用的也编译了,牺牲了平台无关性和代码质量,因为它们不能利用程序的动态行为,也不具有关于加载的类或类层次结构的信息。这避免 JIT 编译器的运行时性能消耗或内存消耗,或者避免解释程序的早期性能开销。极大提高java代码性能。
参考文章:
https://blog.csdn.net/qq_36791569/article/details/80269482
https://blog.csdn.net/xtlisk/article/details/39099199
https://blog.csdn.net/qq_33314190/article/details/89953859
来源:CSDN
作者:boardknight
链接:https://blog.csdn.net/boardknight/article/details/103872554