news 2026/4/15 21:42:52

编译(二):ClassLoader、JIT、AOT、Linker

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
编译(二):ClassLoader、JIT、AOT、Linker

编译(一):基础知识

编译(二):ClassLoader、JIT、AOT、Linker

编译(三):class、dex、so 编译流程


Java ClassLoader

启动类加载器(Bootstrap ClassLoader):

  • 使用C++实现(仅限于HotSpot),是虚拟机自身的一部分。
  • 主要负责加载Java核心类库,%JRE_HOME%\lib下的rt.jar、resources.jar、charsets.jar和class等。
  • 其无法被Java程序直接引用。像String,Integer,Double类都是由引导类加载器加载的

扩展类加载器(Extention ClassLoader):

  • 一般使用Java实现的,独立于虚拟机的外部,由sun.misc.Launcher$ExtClassLoader实现
  • 负责加载Java的扩展类库,主要负责加载目录%JRE_HOME%\lib\ext目录下的jar包和class文件。
  • 开发者可直接使用扩展类加载器

应用程序类加载器(Application ClassLoader):

  • 使用java实现。负责加载应用程序(ClassPath)目录下的所有jar和class文件。
  • 开发者可通过ClassLoader.getSystemClassLoader()方法直接获取
  • 由sun.misc.Launcher$AppClassLoader实现

用户自定义的类加载器(User ClassLoader):

  • 用户自定义的类加载器,可加载指定路径的class文件

Android ClassLoader

URLClassLoader:

  • 只能用于加载jar文件,但是由于 dalvik 不能直接识别jar,所以在 Android 中无法使用这个加载器。

PathClassLoader:

  • 继承于BaseDexClassLoader,封装了一下构造函数, 默认 optimizedDirectory=null。主要用于系统和app的类加载器
  • 它只能加载已经安装的apk。因为 PathClassLoader 只会去读取 /data/dalvik-cache 目录下的 dex 文件。例如我们安装一个包名为com.hujiang.xxx的 apk,那么当 apk 安装过程中,就会在/data/dalvik-cache目录下生产一个名为data@app@com.hujiang.xxx-1.apk@classes.dex的 ODEX 文件。在使用 PathClassLoader 加载 apk 时,它就会去这个文件夹中找相应的 ODEX 文件,如果 apk 没有安装,自然会报ClassNotFoundException。

DexClassLoader:

  • 简单地封装了BaseDexClassLoader对象,并没有覆写父类的任何方法
  • 可用于执行动态加载,但必须是app私有可写目录来缓存odex文件

AOT(Ahead Of Time)和JIT(Just In Time)

JIT的运行流程:

  • 用户运行应用,而这随后就会触发 ART 加载 .dex 文件。
    • 如果有 .oat 文件(即 .dex 文件的 AOT 二进制文件),则 ART 会直接使用该文件。虽然 .oat 文件会定期生成,但文件中不一定会包含经过编译的代码(即 AOT 二进制文件)。
    • 如果没有 .oat 文件,则 ART 会通过 JIT 或解释器执行 .dex 文件。如果有 .oat 文件,ART 将一律使用这类文件。否则,它将在内存中使用并解压 APK 文件,从而得到 .dex 文件,但是这会导致消耗大量内存(相当于 dex 文件的大小)。
  • 针对任何未根据speed编译过滤器编译的应用启用JIT(也就是说,要尽可能多地编译应用中的代码)。
  • 将 JIT 配置文件数据转存到只限应用访问的系统目录内的文件中。
  • AOT 编译 (dex2oat) 守护进程通过解析该文件来推进其编译。

AOT(Ahead Of Time)和JIT(Just In Time)配合:

  • 最初在安装应用程序的时候不执行任何AOT编译。应用程序运行的前几次都将使用解释模式,并且经常执行的方法将被JIT编译。
  • 当设备处于空闲状态IDLE并正在充电时Charging,编译守护进程会根据第一次运行期间存储在 jit code cache 中并生成的Profile文件对常用代码运行AOT编译。
  • 应用程序的下一次重新启动将使用Profile文件引导的代码,并避免在运行时为已编译的方法进行JIT编译。在新运行期间得到JIT编译的方法将被添加到Profile文件中,然后被编译守护进程使用。
Linker
  • linker 在加载 ELF 时的最主要工作是 relocation(重定位),这个过程的目的是为当前 ELF 的每个“导入符号”找到对应的外部符号(函数或数据)的绝对地址。
  • .got.plt:保存外部函数的绝对地址。这就是我们经常会听到的 “GOT 表”。
  • .rel.plt,.rela.plt:用于关联 .dynsym 和 .got.plt。这就是我们经常会听到的 “PLT 表”。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/11 21:38:06

Linux进程与服务管理

Linux进程与服务管理 文章目录Linux进程与服务管理一、前言二、进程与服务管理2.1 进程的基本概述2.1.1 定义2.1.2 分类2.2 Linux进程相关指令详解2.2.1 查看进程:ps2.2.2 终止进程:kill2.2.3 案例2.3 查看进程树指令2.4 Linux服务器管理之service指令2.…

作者头像 李华
网站建设 2026/4/16 9:03:44

基于django的汽车试驾预约服务网站设计与实现

目录 汽车试驾预约服务网站设计与实现摘要 关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 汽车试驾预约服务网站设计与实现摘要 该设计基于Django框架开发,旨在为用户…

作者头像 李华
网站建设 2026/4/16 9:04:17

书匠策AI:文献综述不是“抄摘要”,而是搭建你的学术对话舞台

大家好,我是专注论文写作科普的教育博主。在日常答疑中,我常常看到学生把文献综述写成“文献清单”——每段开头都是“某某(年份)认为……”,结尾却没有任何连接、比较或反思。导师批语往往是:“缺乏逻辑主…

作者头像 李华
网站建设 2026/4/16 9:04:11

学术航海新伙伴:书匠策AI如何重塑文献综述写作图景

在学术研究的汪洋大海中,文献综述如同一张精准的航海图,指引研究者穿越知识的迷雾,发现未知的领域。然而,传统文献综述写作往往耗时费力,如同手工绘制地图般繁琐。今天,我们迎来了一位革命性的学术伙伴——…

作者头像 李华
网站建设 2026/4/16 0:50:14

基于.NET和C#构建光伏IoT物模型方案

一、目前国内接入最常见、最有代表性的 4 类光伏设备二、华为 SUN2000 逆变器通讯报文示例 这是一个标准 Modbus TCP 请求报文: 00 01 00 00 00 06 01 03 75 30 00 06 含义: Modbus TCP 报文由两部分组成: MBAP Header(7字节&…

作者头像 李华
网站建设 2026/4/16 9:05:26

React Native for OpenHarmony 实战:Sound 音频播放详解

React Native for OpenHarmony 实战:Sound 音频播放详解 摘要 本文深入探讨React Native在OpenHarmony平台上的音频播放实现方案。通过对比主流音频库react-native-sound和expo-av的适配表现,结合OpenHarmony音频子系统的特性,提供完整的音…

作者头像 李华