Android热修复1、class文件与dex文件解析//www.greatytc.com/p/dea6a368944d
Android热修复2、虚拟机深入讲解//www.greatytc.com/p/17f7843e09bc
Android热修复3、ClassLoader原理讲解//www.greatytc.com/p/e3970180a002
Android热修复4、热修复简单讲解//www.greatytc.com/p/1691685aeedf
Android热修复5、AndFix详解//www.greatytc.com/p/1cfad3d1079a
Android热修复6、Tinker详解及两种方式接入//www.greatytc.com/p/0ae5c0c259d1
Android热修复7、引入热修复后代码及版本管理//www.greatytc.com/p/cd5104a6205c
java虚拟机结构解析
JVM整体结构讲解
类加载器核心即ClassLoader(下一章详细讲解)加载class到内存空间。
Java代码编译和执行过程
jvm字节码即class字节码。
有了class字节码,就需要类加载器加载到内存中。
有哪些类加载器呢?:
Bootstrap ClassLoader和Extension ClassLoader是加载jdk特定jar包的。
App ClassLoad加载应用程序的,是应用程序真正用到的加载器。
Custom ClassLoad 我们自定义加载的ClassLoad。
如何加载class到内存:
Loading:从类文件中获取类的信息并且加载到JVM的内存里;
Verifying:检查读入的结构是否符合JVM规范的描述
Preparing:分配一个结构来存储累的信息
Resolving:把这个类的常量池中的所有的符号引用变成直接引用
Initializing:执行静态初始化程序,把静态变量初始化成指定的值
JVM内存管理(面试重点)
1栈:
作用:存放java方法执行时的所有的数据
组成:由栈帧组成,一个栈帧代表一个方法的执行
栈帧:
每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈
a方法---压出b--->b方法---执行完弹出并返回a--->a方法
栈帧包含:局部变量表、栈操作数、动态链接、方法出口
2本地方法栈
作用:和栈区别不大,专门为native方法服务的,也是通过栈帧记录每个方法调用。
3方法区
存储被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后等数据。方法区是永远占据内存的。
4堆
作用:所有通过new创建的对象的内存都存在堆中分配
特点:是虚拟机中最大的一块内存,是GC要回收的部分
详情查询:新生代、老年代、永久代。
垃圾回收(面试重点)
垃圾收集算法(哪些对象算是垃圾):
1引用记数算法(1.2之前)
对象有个计数器,有人引用+1,去掉一个引用-1,0时回收;
无法解决相互引用的问题。
2可达性算法(根搜索算法)
遍历,路径可达,不回收
对象有哪些类型的引用?
强引用、软引用、弱引用、虚引用(使用最多的是强引用和弱引用)
弱引用创建:
先要有个强引用
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj)
obj = null
wf.get();// 要判断是否为空
垃圾回收算法:
1标记清除算法
遍历,标记不可达的,回收
好处:不需要进行对象移动
坏处:内存碎片
2复制算法
遍历,可达的,复制到另一块空间
好处:存活对象少时极为高效
坏处:需要另一块内存空间
3标记整理算法
遍历,标记清除基础上,往空闲处移动。解决碎片问题
三者结合使用。比如存活少时,用复制算法。
垃圾回收触发时机:
.java虚拟机无法为新的对象分配内存空间了
.手动调用System.gc()方法(强烈不推荐,并不会立刻执行,加大了压力)
.低优先级的GC线程,被运行时就会执行GC
Jvm与Dalvik不同
.执行文件不同,class,dex;
.类加载系统与JVM区别大(下一章详细讲);
.可以同时存在多个DVM,java虚拟机只能同时存在一个(一个挂了不会影响其他的);
.Dalvik是基于寄存器的,而JVM是基于栈的;
ART比Dalvik有哪些优势
.DVM使用JIT来将字节码转化成机器码,效率低
(JIT技术是应用程序每次执行时都讲字节码转化成机器码,一旦退出重新转化)
.ART采用了AOT预编译技术,执行速度更快
(AOT即ahead of time 应用程序安装时就把字节码转化成机器码存在存储介质中)
.ART会占用更多的安装时间和存储空间(空间换时间)