首页 > 其他分享 >JIT与AOT

JIT与AOT

时间:2024-07-04 11:31:09浏览次数:21  
标签:Java Image 编译 JIT AOT Native Compiler

JIT

JIT(Just-in-Time,实时编译)一直是Java语言的灵魂特性之一,HotSpot JVM中集成了两种JIT编译器,Client Compiler和Server Compiler,它们的作用也不同。Client Compiler注重启动速度和局部的优化,Server Compiler则更加关注全局的优化,性能会更好,但由于会进行更多的全局分析,所以启动速度会变慢。两种编译器有着不同的应用场景,在虚拟机中同时发挥作用。而随着时间的发展,不论是Client Compiler还是Server Compiler都发展出了各具特色的实现,如 C1、C2、Graal Compiler等,你可以在JVM启动参数中选择自己所需的JIT编译器实现。

JIT与AOT的区别

提前编译是相对于即时编译的概念,提前编译能带来的最大好处是Java虚拟机加载这些已经预编译成二进制库之后就能够直接调用,而无须再等待即时编译器在运行时将其编译成二进制机器码。理论上,提前编译可以滅少即时编译带来的预热时间,减少Java应用长期给人带来的“第一次运行慢"的不良体验,可以放心地进行很多全程序的分析行为,可以使用时间压力更大的优化措施。但是提前编译的坏处也很明显,它破坏了Java"—次编写,到处运行"的承诺,必须为每个不同的硬件、操作系统去编译对应的发行包;也显著降低了Java链接过程的动态性,必须要求加载的代码在编译期就是全部已知的,而不能在运行期才确定,否则就只能舍弃掉己经提前编译好的版本,退回到原来的即时编译执行状态。

AOT的优点

在程序运行前编译,可以避免在运行时的编译性能消耗和内存消耗
可以在程序运行初期就达到最高性能,程序启动速度快
运行产物只有机器码,打包体积小

AOT的缺点

由于是静态提前编译,不能根据硬件情况或程序运行情况择优选择机器指令序列,理论峰值性能不如JIT
没有动态能力,使用到反射、动态编译需要额外处理。
同一份产物不能跨平台运行。

Native Image:原理与限制

Native Image的输入是整个应用的所有组件,包括应用本身的代码、各种依赖的库、JDK库、以及SVM;首先会进行整个应用的初始化,也就是代码的静态分析,这个分析过程有点类似GC中的“可达性分析”,会讲程序运行过程中将所有可达的代码、变量、对象生成一个快照,最终打包成一个可执行的Native Image。

一个完整的Native Image包含两个部分,一部分称为 Text Section,即用户代码编译成的机器代码;另一部分称为 Data Section,存储了应用启动后堆区内存中各种对象的快照。
例如反射、代理,要如何进行静态分析呢?很显然,这两者之间是存在冲突的,因此Native Image设置了一个名为“Closed World”的假设作为静态分析的基本前提。

这个基本前提包含三个要求,对应的也就是目前Native Image存在的三个限制:

Points-to分析的时候,需要接受完整的字节码作为输入(即项目中所有用到的class的字节码都需要获取的到)。
=> 在运行期动态生成或者是动态获取字节码的程序,无法构建成 Native Image。

Java的动态特性,包括反射、JNI、代理,都需要通过配置文件在构建前实现声明好。
=> 无法提前声明动态特性使用范围的程序,无法构建成Native Image (例如,根据用户输入的一个参数反射去调用某个方法)。

在整个运行过程中,程序不会再加载任何新的class。
=> 在运行期间执行动态编译,或者是自定义Classloader动态装载类的程序,无法构建成Native Image。

Spring Native

 

标签:Java,Image,编译,JIT,AOT,Native,Compiler
From: https://www.cnblogs.com/zhengbiyu/p/18283301

相关文章

  • [翻译].NET 8 的原生AOT及高性能Web开发中的应用[附性能测试结果]
    原文:[ADiveinto.Net8NativeAOTandEfficientWebDevelopment]作者:[sharmilasubbiah]引言随着.NET8的发布,微软迈出了重要一步,为ASP.NETCore引入了原生的Ahead-of-Time(AOT)编译。这一进步不仅提高了应用程序的性能,还简化了开发过程,标志着.NET生态系统进......
  • [翻译].NET 8 的原生AOT及高性能Web开发中的应用[附性能测试结果]
    原文:[ADiveinto.Net8NativeAOTandEfficientWebDevelopment]作者:[sharmilasubbiah]引言随着.NET8的发布,微软迈出了重要一步,为ASP.NETCore引入了原生的Ahead-of-Time(AOT)编译。这一进步不仅提高了应用程序的性能,还简化了开发过程,标志着.NET生态系统进......
  • [翻译].NET 8 的原生AOT及高性能Web开发中的应用[附性能测试结果]
    原文:[ADiveinto.Net8NativeAOTandEfficientWebDevelopment]作者:[sharmilasubbiah]引言随着.NET8的发布,微软迈出了重要一步,为ASP.NETCore引入了原生的Ahead-of-Time(AOT)编译。这一进步不仅提高了应用程序的性能,还简化了开发过程,标志着.NET生态系统进......
  • php8开启jit
    JIT时php8的重要功能之一,可以极大的提高性能;JIT编译器集成在了Opcache插件中,仅在启动Opcache插件才有效Opcache将PHP脚本编译后的字节码存储到内存中,以避免每次执行脚本时重新解析和编译,从而提高PHP应用程序的性能和响应速度。 Opcache开启:编辑php.ini文件,将zend_exten......
  • Numba @jitclass:实践、踩雷注意事项
    @jitclass允許定義類並進行JIT編譯。然而,在使用jitclass時,以下是一些重要的注意事項。如果你也在numbajitdebug地狱,希望这个对你有所帮助注意事项设定明确的spec每个class中的var都需要设定,简言之就是使用self.xxx的都要fromnumbaimportjit,int32,float64,......
  • cuda-toolkit 设置环境变量 CUDA_FORCE_ PTX_JIT的作用
    设置环境变量CUDA_FORCE_PTX_JIT的作用是控制NVIDIACUDA运行时是否强制使用PTX即时编译(Just-In-Timecompilation)。当这个环境变量被设置时,它会对CUDA程序的行为产生以下影响:禁用二进制缓存加载:正常情况下,CUDA运行时会尝试从二进制缓存中加载预先编译好的cubin(CUDA二进制)文......
  • .NET8极致性能优化AOT
    前言.NET8对于性能的优化是方方面面的,所以AOT预编译机器码也是不例外的。本篇来看下对于AOT的优化。原文:.NET8极致性能优化AOT详述首先明确一个概念,.NET里面的AOT它是原生的。什么意思呢?也就是说通过ILC编译器(AOT编译器,参考:.Net7新编译器ILC简析)编译出来的代码是各个平......
  • 通过 .NET NativeAOT 实现用户体验升级
    前言#TypedocConverter 是我先前因帮助维护monaco-editor-uwp但苦于monacoeditor的API实在太多,手写C#的类型绑定十分不划算而发起的一个项目。这个工具可以将typedoc根据TypeScript生成的JSON文件直接生成对应的C#类型绑定代码,并提供完整的JSON序列化支持,......
  • .NET 7 AOT 的使用以及 .NET 与 Go 互相调用
    目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#和Golang互调C#调用GolangGolang调用C#其他 背景其实,规划这篇文章有一段时......
  • dotnet c# samples core nativeaot NativeLibrary
     如何在System.Text.Json中使用源生成 https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/source-generation?pivots=dotnet-8-0 https://github.com/dotnet/samples/tree/main/core/nativeaot/NativeLibrary   ......