【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 中 ) ;


目录
相关文章
|
1天前
|
Arthas 监控 Java
Arthas memory(查看 JVM 内存信息)
Arthas memory(查看 JVM 内存信息)
25 6
|
1月前
|
存储 缓存 算法
JVM简介—1.Java内存区域
本文详细介绍了Java虚拟机运行时数据区的各个方面,包括其定义、类型(如程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和直接内存)及其作用。文中还探讨了各版本内存区域的变化、直接内存的使用、从线程角度分析Java内存区域、堆与栈的区别、对象创建步骤、对象内存布局及访问定位,并通过实例说明了常见内存溢出问题的原因和表现形式。这些内容帮助开发者深入理解Java内存管理机制,优化应用程序性能并解决潜在的内存问题。
179 29
JVM简介—1.Java内存区域
|
1月前
|
消息中间件 Java 应用服务中间件
JVM实战—2.JVM内存设置与对象分配流转
本文详细介绍了JVM内存管理的相关知识,包括:JVM内存划分原理、对象分配与流转、线上系统JVM内存设置、JVM参数优化、问题汇总。
JVM实战—2.JVM内存设置与对象分配流转
|
1月前
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
2月前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
227 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
2月前
|
存储 算法 Java
JVM: 内存、类与垃圾
分代收集算法将内存分为新生代和老年代,分别使用不同的垃圾回收算法。新生代对象使用复制算法,老年代对象使用标记-清除或标记-整理算法。
42 6
|
4月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
5月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
1071 1
|
5月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
5月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
56 3

热门文章

最新文章

下一篇
oss创建bucket