【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )

简介: 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )

一、动态加载 " 插件 "


插件化 中 , " 宿主 " 模块 和 " 插件 " 模块 可以分开进行编译 , 二者之间互不影响 , 各个模块可以并发进行开发 , " 宿主 " 模块 可以 动态更新插件 ;


动态加载 " 插件 " 模块 是插件化开发的核心 ;


动态加载 : " 宿主 " 模块 , 没有具体的业务 , 只提供一个空壳 , 功能逻辑实现都在 " 插件 " 模块中 , 在程序运行之后 , 才动态加载 " 插件 " 模块 APK 文件 ;


组件化 主要是设计好整个程序的架构 , 使用 Gradle 控制并切换 组件模式 / 集成模式 , 核心是 组件路由 的使用 ;


插件化 的核心就是实现 " 插件 " APK 的 动态加载与调用 ;


二、Java 虚拟机中的内存存储


程序运行之后 , 通过 ClassLoader 可以 动态地加载类 ; 加载后的 字节码 数据都存放在 Java 虚拟机的运行期数据区 中 ;


手机为 JVM 虚拟机分配一块内存 , 总称为 JVM 运行期数据区 , 该数据区分为以下几块内容 ,


格局线程划分 , 可以分为 线程共享数据区 和 线程不共享数据区 ;


线程不共享数据区 中 , 包含如下几个内存区域


JVM 栈 : Java 虚拟机栈 , 存放 局部变量 , Class 字节码数据 ;

本地方法栈 ;

程序计数器 : 该区域没有 OOM ;


线程共享的区域


Java 堆 : Java 中通过 new 创建的对象 , 都存放在 Java 堆中 ;

方法区 : 存储 常量值 , 静态变量 , 该内存区域的数据很少被回收 ;


Student student = new Student();

1

上述方法涉及到了 3 33 个区域 ,


区域 1 11 : new Student() 创建的对象在 Java 堆中 ;


区域 2 22 : Student student 放在 Java 虚拟机栈中 , 保存了指向 Java 堆中对象的地址 ;


区域 3 33 : 程序计数器 ;


类加载时 , 在上述 JVM 栈中拿到 Class 字节码数据 , 生成 Class 对象 ;


加载 Student 类的 Class 字节码对象的情景 :


① 调用 new Student() 构造函数 , 一定会将 Student.class 类对象加载到内存中 , 该 Class 类字节码对象 内存中只存在一个 ; 如果程序中没有加载 Student 类对象 , 就无法使用 Student 类 ;


② Student 类中有静态变量 ;


③ Student 类的子类 Class 对象加载 ;


三、类加载流程


具体的动态加载 Class 的流程参考如下步骤 :


1 . 步骤一 : 获得系统 DexPathList 中的 Element[] dexElements 数组 ,


( libcore/dalvik/src/main/java/dalvik/system/DexPathList.java ) ;


2 . 步骤二 : 在本应用中创建 Element[] dexElements 数组 , 用于存放解密后的 dex 文件 ;


3 . 步骤三 : 将 系统加载的 Element[] dexElements 数组 , 与我们自己创建的 Element[] dexElements 数组进行 合并操作


4 . 步骤四 : 替换 ClassLoader 加载过程中的 Element[] dexElements 数组 ( 封装在 DexPathList 中 ) ;


目录
相关文章
|
24天前
|
监控 算法 Java
Java内存管理:垃圾收集器的工作原理与调优实践
在Java的世界里,内存管理是一块神秘的领域。它像是一位默默无闻的守护者,确保程序顺畅运行而不被无用对象所困扰。本文将带你一探究竟,了解垃圾收集器如何在后台无声地工作,以及如何通过调优来提升系统性能。让我们一起走进Java内存管理的迷宫,寻找提高应用性能的秘诀。
|
1月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
|
1月前
|
存储 算法 Java
JVM自动内存管理之垃圾收集算法
文章概述了JVM内存管理和垃圾收集的基本概念,提供一个关于JVM内存管理和垃圾收集的基础理解框架。
JVM自动内存管理之垃圾收集算法
|
1月前
|
存储 Java 程序员
JVM自动内存管理之运行时内存区
这篇文章详细解释了JVM运行时数据区的各个组成部分及其作用,有助于理解Java程序运行时的内存布局和管理机制。
JVM自动内存管理之运行时内存区
|
1月前
|
编译器 C++
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
virtual类的使用方法问题之C++类中的非静态数据成员是进行内存对齐的如何解决
|
1月前
|
存储 算法 大数据
小米教你:2GB内存搞定20亿数据的高效算法
你好,我是小米。本文介绍如何在2GB内存中找出20亿个整数里出现次数最多的数。通过将数据用哈希函数分至16个小文件,每份独立计数后选出频次最高的数,最终比对得出结果。这种方法有效解决大数据下的内存限制问题,并可应用于更广泛的场景。欢迎关注我的公众号“软件求生”,获取更多技术分享!
147 12
|
1月前
|
C++ 容器
curl使用小记(三)——获取远端数据到内存缓冲区
curl使用小记(三)——获取远端数据到内存缓冲区
35 0
|
1月前
|
算法 Java
JVM自动内存管理之垃圾收集器
这篇文章是关于Java虚拟机(JVM)自动内存管理中的垃圾收集器的详细介绍。
|
1月前
|
存储 编译器 C语言
数据在内存中的存储
数据在内存中的存储
|
2月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
189 14