当前位置: 首页 > article >正文

【Java基础面试题003】Java的JIT | AOT是什么?

回答重点

Java中的JIT编译器(Just-In-Time,即时编译)是一种在程序运行时将字节码转为机器码的技术

因为这种转换是在程序运行时即时进行的,因此得名"Just-In-Time"。

JIT监测到热点代码(频繁执行的代码段)时,就将这段Java代码提前编译成本地机器码,空间换时间,减少解释执行的开销,提高运行效率,也使得Java代码接近本地代码的性能。

(本地代码:指的是当前机器的经过编译后CPU可直接执行的机器码,性能会非常高)

Java的AOT(Ahead-Of-Time,预编译)是一种在编译期将所有或部分字节码转换成机器码。这是一个静态过程,发生在应用程序运行之前。

扩展知识

热点代码(Hotspot Code)

JIT编译器重点优化"热点代码",即被多次调用的方法,还有被多次执行的循环体。通过分析代码执行频率,JIT能识别这些热点并进行优化编译

JIT的优化编译采用了多种技术:如方法内联(Inlining)、逃逸分析(Escape Analysis)、循环展开(Loop Unrolling)等,使得编译后的机器码更加高效

JIT编译的类型

C1编译效率比C2快,但是优化效果不如C2

  • C1(Client Compiler):用于快速启动的轻量级优化,适用于客户端应用程序
  • C2(Server Compiler):用于长时间运行的重量级优化,适用于服务端的应用程序

JIT的调优

JVM提供了多种参数用于调优JIT编译器,如-XX:+PrintCompilation用于输出编译信息,-XX:TieredStopAtLevel控制JIT编译级别等

通过调优,可以在启动时间和运行性能之间取得平衡

JVM将执行状态分成了5个层次:

0层,解释执行(Interpreter)

1层,使用C1即时编译器编译执行(不带profiling)

2层,使用C1即时编译器编译执行(带基本的profiling)

3层,使用C1即时编译器编译执行(带完全的profiling)

4层,使用C2即时编译器编译执行

AOT的工作原理

AOT编译是在构建阶段的编译期间对全部Java字节码进行静态分析,并将其编译为目标平台的机器码。编译后的代码可以直接运行在目标硬件上,无需在运行时通过JVM进行解释或即时编译

(构建阶段包括:源代码编译,依赖管理,资源处理,AOT编译,打包和发布)

AOT的优点

  • 快速启动:由于代码已经编译为本地机器码,AOT减少了程序启动时的编译开销,适合需要快速启动的应用场景
  • 更小的内存占用:在不需要JIT编译器的情况下,AOT编译减少了JVM的内存占用

AOT的缺点

缺乏运行时优化:AOT编译器由于缺乏运行时信息,AOT 只能基于静态分析进行代码优化,无法像JIT编译器那样利用运行时的动态信息进行深度优化。可能导致在长时间运行的应用程序中性能低于JIT

平台依赖性:AOT编译出的机器码是针对特定平台的,缺乏跨平台的灵活性

AOT的使用场景

也就是可以不需要JIT编译器的情况

        ①部分资源有限的嵌入式系统,这些设备通常具有较小的内存和处理能力,AOP能提供一个轻量级的解决方案;

        ②还有简单脚本工具,桌面小工具;

        ③还有某些容器化环境,希望缩短启动时间,无需再容器运行时依赖JIT编译

以及对启动性能比较敏感的场景

Java自带的AOT工具

  • GraalVM:GraalVM是一个多语言虚拟机,支持Java的AOT编译。它可以将Java应用程序编译成独立的本地可执行文件,这些文件不依赖JVM,即可直接运行在操作系统中
  • jaotc:在Java9中引用的jaotc工具可以将Java字节码编译为AOT的本地代码,不过jaotc的 使用在生产环境中并不广泛


http://www.kler.cn/a/419220.html

相关文章:

  • Vue 3 的双向绑定原理
  • 华为机试HJ77 火车进站
  • 详细讲解Sort自定义排序(JavaJavaScript)
  • 【Linux课程学习】:文件第二弹---理解一切皆文件,缓存区
  • dolphin Master 报错 handler error: java.lang.NullPointerException: null
  • 241127学习日志——[CSDIY] [InternStudio] 大模型训练营 [20]
  • 【数据可视化入门】Python散点图全攻略:Matplotlib、Seaborn、Pyecharts实战代码大公开!
  • leetcode 3232. 判断是否可以赢得数字游戏 简单
  • 计算机网络安全 —— 非对称加密算法 RSA 和数字签名
  • springboot363高校竞赛管理系统(论文+源码)_kaic
  • 服务熔断-熔断器设计
  • 【JavaEE】JavaEE、web 开发、框架(Spring) 、Maven
  • SAP-ABAP开发-第二代增强示例
  • Day1——GitHub项目共同开发
  • Vue进阶之单组件开发与组件通信
  • Unity中实现A*寻路算法参考
  • Scala 的知识点
  • Linux中pcap_loop()函数
  • 算法的复杂度
  • LeetCode:19.删除链表倒数第N个节点
  • 解决jupyter notebook 新建或打开.ipynb 报500 : Internal Server Error(涉及jinja2兼容性问题)
  • 蓝桥-希尔排序模板题
  • 【Java基础面试题004】封装、继承、重载、多态、接口和抽象类是什么?
  • 《JavaEat:探索 Java 在美食世界的奇妙之旅》
  • 无星的微前端之旅(四)——qiankun线上服务代理到本地
  • 后端-一对一的数据封装的两种写法对比