Jacky's blog
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)

Jack Yang

编程; 随笔
首页
  • 学习笔记

    • web
    • android
    • iOS
    • vue
  • 分类
  • 标签
  • 归档
收藏
  • tool
  • algo
  • python
  • java
  • server
  • growth
  • frida
  • blog
  • SP
  • more
GitHub (opens new window)
  • tutorial
  • jetpack

  • components

  • androidx

  • 动态化
  • apm

  • module

  • harmony

  • tool

  • other

    • Flutter 高频面试问答
    • 生产环境Message分发处理设计
    • 事件分发机制
    • 调研抖音对harmonyOS4的优化
    • Android 评论at功能的实现
    • 探索抖音禁止录屏
    • 对32位手机崩溃的优化记录
    • GradientDrawable
    • android window
    • color
    • webview白屏检测
    • android Resource
    • deeplink技术
    • android-xml
    • ANDROID IPC
    • BottomSheetBehavior研究与思考
    • viewPager
    • Android密钥系统
    • compiler
      • JIT 和 AOT
        • 什么是 JIT 编译?
        • 什么是 AOT 编译?
        • JIT 和 AOT 编译对比
        • 在 Android 中的应用
        • 典型应用场景
    • 提升UI加载速度的几点思考
    • Android零耗时首帧体验
    • jsbridge
    • retrofit动态代理设计
    • gif与属性动画的对比
  • kotlin

  • 《android》
  • other
Jacky
2024-11-26
目录

compiler

# JIT 和 AOT

JIT(Just-In-Time)和 AOT(Ahead-Of-Time)是两种常见的代码编译技术,它们在现代编程语言运行时中扮演重要角色。以下是对它们的详细解释,包括工作原理、优缺点以及在 Android 中的应用:

links
  • AOT vs JIT Compiler: Which is Better for Angular Development? AOT 与 JIT 编译器:哪个更适合 Angular 开发? (opens new window)

# 什么是 JIT 编译?

JIT 编译是一种 运行时编译 技术,它在程序执行过程中将字节码(中间代码)即时翻译为机器码

工作原理
  1. 初始状态:程序以字节码形式运行在虚拟机上(如 Java 的 JVM 或 Android 的 ART)
  2. 监控热点代码:JIT 编译器监控哪些方法或代码片段被频繁调用(即 "热点代码")
  3. 即时编译:将热点代码即时编译为机器码,以提高执行效率
  4. 动态优化:基于运行时信息,进行优化(如内联、消除冗余等)
  5. 缓存结果:编译后的机器码被缓存,减少重复编译的开销
优点
  1. 动态优化:能根据实际运行情况进行优化,性能更高
  2. 启动快:初始时无需编译整个程序,启动速度快
  3. 跨平台性:字节码可以跨平台运行,适配不同架构
缺点
  1. 初始性能较低:未编译的代码以解释模式运行,可能较慢
  2. 额外开销:运行时监控和编译增加内存和 CPU 消耗
  3. 缓存失效:机器码缓存可能因环境改变而失效

# 什么是 AOT 编译?

AOT 编译是一种 静态编译 技术,它在程序运行之前将代码直接编译为目标平台的机器码

工作原理
  1. 编译阶段:在程序安装或发布时,AOT 编译器将字节码翻译为机器码
  2. 运行阶段:程序直接运行预编译的机器码,无需解释或即时编译
优点
  1. 性能稳定:启动速度快,运行时性能高,无需解释或动态编译
  2. 减少开销:无运行时编译的额外资源消耗
  3. 安全性:提前编译避免运行时动态生成代码的潜在漏洞
缺点
  1. 编译时间长:安装或发布时需要耗费时间进行静态编译
  2. 缺乏动态优化:无法根据运行时信息进行进一步优化
  3. 平台绑定:编译后的代码只能运行在目标平台上

# JIT 和 AOT 编译对比

特性 JIT 编译 AOT 编译
编译时间 运行时即时编译 编译阶段一次性完成
性能 初始较低,动态优化后性能高 性能稳定,但无动态优化
启动时间 较慢,需解释字节码后编译 快,直接运行机器码
内存占用 需要额外内存用于运行时编译和缓存 占用较少
跨平台支持 高,依赖字节码 低,编译后绑定特定架构

# 在 Android 中的应用

Dalvik 虚拟机(早期 Android,API <= 19)

  • 使用 JIT 编译
  • 每次运行时都需要即时编译,性能提升有限

ART 虚拟机(Android Runtime,API >= 21) ART 是 Android 引入的运行时替代 Dalvik 的虚拟机,结合了 AOT 和 JIT 的优点:

  1. AOT 编译(安装时)
  • 在应用安装时将字节码编译为机器码(*.oat 文件)
  • 优化启动时间和运行时性能
  1. JIT 编译(运行时)
  • 从 Android 7.0(API 24)开始,ART 支持 JIT 编译:
    • 对未被 AOT 编译的代码进行即时优化
    • 动态监控和编译热点代码,进一步提升性能
  1. 混合模式
  • AOT 提供稳定的基础性能
  • JIT 提供动态优化和适应性

# 典型应用场景

  • JIT 适用场景

    • 开发阶段:快速测试和调试,减少每次修改后的编译时间
    • 跨平台应用:如 Java、Kotlin、Python 等需要跨平台的语言
  • AOT 适用场景

    • 生产环境:需要快速启动和稳定性能的应用
    • 嵌入式设备:资源受限且环境固定的系统
上次更新: 2024/12/01, 19:05:35
Android密钥系统
提升UI加载速度的几点思考

← Android密钥系统 提升UI加载速度的几点思考→

最近更新
01
npx 使用指南
10-12
02
cursor
09-28
03
inspect
07-20
更多文章>
Theme by Vdoing | Copyright © 2019-2025 Jacky | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式