【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.mzph.cn/pingmian/62539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 `aircrack-ng`扫描、获取握手包

使用 aircrack-ng 工具集来扫描 5GHz WiFi 网络的过程与扫描 2.4GHz 网络类似,但需要注意一些特定的配置和命令。以下是一个详细的步骤指南,帮助你在 5GHz 频段上扫描 WiFi 网络并捕获握手包。 ### 前提条件 1. **操作系统**:通常在 Linux 系…

[GKCTF 2021]签到

[GKCTF 2021]签到 wireshark跟踪http流,基本编解码,倒叙,栅栏密码 找到cat /f14g 把包里返回的字符串先hex解码,再base64解码,看到一个时间是倒叙,不含flag 继续往下面翻,可以看到cat%2Ff14g%7…

【Linux】【字符设备驱动】深入解析

Linux字符设备驱动程序用于控制不支持随机访问的硬件设备,如串行端口、打印机、调制解调器等。这类设备通常以字符流的形式与用户空间程序进行交互。本节将深入探讨字符设备驱动的设计原理、实现细节及其与内核其他组件的交互。 1. 引言 字符设备驱动程序是Linux内…

【论文笔记】Tool Learning with Foundation Models 论文笔记

Tool Learning with Foundation Models 论文笔记 文章目录 Tool Learning with Foundation Models 论文笔记摘要背景:工作: 引言工具学习的发展本文工作(大纲&目录) 背景2.1 工具使用的认知起源2.2 工具分类:用户界…

电阻可靠性的内容

一、影响电阻可靠性的因素: 影响电阻可靠性的因素有温度系数、额定功率,最大工作电压、固有噪声和电压系数 (一)温度系数 电阻的温度系数表示当温度改变1摄氏度时,电阻阻值的相对变化,单位为ppm/℃.电阻温…

GitLab: You cannot create a branch with a SHA-1 or SHA-256 branch name

最近在迁移git库,把代码从gerrit迁移到gitlab,有几个库报错如下: GitLab: You cannot create a branch with a SHA-1 or SHA-256 branch name ! [remote rejected] refs/users/73/373/edit-95276/1 -> refs/users/73/373/edit-95276/1 (p…

Redis等Spring Cache 框架 实现基于注解的缓存功能

Spring Cache 框架 实现基于注解的缓存功能 底层 基于代理技术 一旦进入方法就进入代理对象 如果redis里有就直接返回 不会走方法 如果缓存没有数据 则通过反射走方法。 概念 缓存 相当于之前的事务处理 同步更改 只是提供了一层抽象 底层可以切换不同的缓存实现 EHCach…

C#中的工厂模式

在C#中,工厂模式(Factory Pattern) 是一种常见的设计模式,它属于创建型模式,主要用于定义一个用于创建对象的接口,让子类决定实例化哪一个类。通过使用工厂模式,客户端代码不需要直接实例化具体…

【Zookeeper】三,Zookeeper的安装与基本操作

文章目录 安装Zookeeper下载解压解压后的目录结构运行Zookeeper 基本操作 安装Zookeeper 下载 官网下载Zookeeper,会得到一个tar包,如:apache-zookeeper-3.8.4-bin.tar.gz 解压 tar -xvf apache-zookeeper-3.8.4-bin.tar.gz -C /usr/loca…

MyBatis(mybatis_plus)中TypeHandler的使用教程

MyBatis(mybatis_plus)中TypeHandler的使用教程 一.TypeHandler作用及其使用场景 在我们平常开发操作数据库时,查询、插入数据等操作行为,有时会报数据类型不匹配异常,就可以得知数据的类型是不唯一的必然是多种不同…

【Python TensorFlow】进阶指南(续篇四)

在前面的文章中,我们探讨了TensorFlow在实际应用中的多种高级技术和实践。本文将继续深入讨论一些更为专业的主题,包括模型压缩与量化、迁移学习、模型的动态调整与自适应训练策略、增强学习与深度强化学习,以及如何利用最新的硬件加速器&…

C++基础入门详细教程-6函数

6函数 6.1概述 作用:将一段经常使用的代码封装起来,减少重复代码 一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。 6.2函数的定义 函数的定义一般主要有5个步骤: 1.返回值类型 2.函数名 3.参数…

HASH256开源代码计算错误问题

计算量超500KB报错 OTA升级中可能会涉及到CRC、hash校验等算法,小编从网上抄到了HASH256的源码,拿来使用的时候却发现了一个问题,当源文件约大于500KB的时候会发现其计算出的hash值出现错误。 经过实际测试得知,当源文件大于约50…

【人工智能】Python常用库-TensorFlow常用方法教程

TensorFlow 是一个广泛应用的开源深度学习框架,支持多种机器学习任务,如深度学习、神经网络、强化学习等。以下是 TensorFlow 的详细教程,涵盖基础使用方法和示例代码。 1. 安装与导入 安装 TensorFlow: pip install tensorflow…

Spring Boot教程之十一:获取Request 请求 和 Put请求

如何在 Spring Boot 中获取Request Body? Java 语言是所有编程语言中最流行的语言之一。使用 Java 编程语言有几个优点,无论是出于安全目的还是构建大型分发项目。使用 Java 的优点之一是 Java 试图借助类、继承、多态等概念将语言中的每个概念与现实世…

uniapp实现组件竖版菜单

社区图片页面 scroll-view scroll-view | uni-app官网 (dcloud.net.cn) 可滚动视图区域。用于区域滚动。 需注意在webview渲染的页面中&#xff0c;区域滚动的性能不及页面滚动。 <template><view class"pics"><scroll-view class"left"…

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前&#xff0c;需要搭建Node环境以及Vue-CLI脚手架&#xff0c;由于本篇文章为上一篇文章的补充&#xff0c;也是为了给大家分享更为完整的搭建vue项目方式&#xff0c;所以环境准备部分采用Vue教程&#xff5c;搭建vue项目&#xff5c;V…

Rust面向对象特性

Rust的面向对象特性 本文已同步至自建博客 Rust在设计的时候受到很多编程范式的影响&#xff0c;包括面向对象。面向对象的语言共有一些共同的特征&#xff0c;即对象、封装和继承。 封装 一个对象的实现细节对使用该对象的代码不可访问。因此&#xff0c;对象交互的唯一方…

前海湾地铁的腾通数码大厦背后的临时免费停车点探寻

临时免费停车点&#xff1a;前海湾地铁的腾通数码大厦背后的桂湾大街&#xff0c;目前看不仅整条桂湾大街停了​车&#xff0c;而且还有工地餐点。可能是这个区域还是半工地状态&#xff0c;故暂时还不会有​罚单的情况出现。 中建三局腾讯数码大厦项目部A栋 广东省深圳市南山…

Python知识分享第十五天

“”" 细节: 1.如下定义的类的几种写法 并无任何区别 最终效果都一样 只是写法不同 2.所有的类都直接或间接继承自object 它是所有类的父类 定义类的格式 格式1 class 类名: pass 格式2 class 类名(): pass 格式3 class 类名(父类名): pass “”" # 需求: 通过上述…