插件化,热修复基础之虚拟机

java虚拟机 jvm

jvm整体结构


image.png

jvm内存空间

java 栈区 它存放的是java方法执行时的所有的数据
栈帧 一个栈帧代表一个方法 每个方法的调用就是一个栈帧在虚拟机栈中入栈和出栈

本地方法栈:专门为nativie方法服务,也是通过栈帧调用

方法区,存储被虚拟机加载的类信息,常量,静态变量等数据。

java堆:所有通过new创建的对象的内存都在堆中分配,是虚拟机中最大的一块内存,是gc要回收的部分

image.png

gc垃圾回收机制

垃圾收集算法
1,引用计数算法 对象被引用 计数器加1 (老算法,存在A-B相互引用,不会被回收)

2,可达性算法:从gcroot节点。寻找引用节点。没有引用的节点标记为垃圾节点,

4种引用类型

分为4种,用来控制对象的生命周期
强引用 不会被垃圾回收期回收,会抛出oom异常
软引用 在内存足够的情况下 不会去回收 效果和强引用一样
弱引用 生命周期比软引用少很多,在gc回收的时候,不管内存是否足够 都会回收他
虚引用 就是没有引用,垃圾回收期任何时候都会回收他
refercequene 一般和软引用,弱引用关联
如果软应用被垃圾回收期回收了 就会把这个引用加入到这个队列当中

垃圾回收算法
1,标记清除算法: 从根节点遍历,将不可达的引用标记,在gc执行的时候回收掉标记后的引用,缺点是会造成内存碎片
2,复制算法:从根节点遍历,复制所有可达的引用到一个新的内存,将原来的引用内存清空,不会产生碎片,但是效率比第一种差,(适合内存存活较少的时候)
3,标记整理算法:从根节点遍历,将不可达的标记,清除后, 更新指针,将引用对象往空闲区移动,避免产生内存碎片

jvm虚拟机触发垃圾回收的时机
1,java虚拟机无法在为新的对象分配内存空间的时候
2,手动调用system.gc
3,低优先级的gc线程被启动

java源代码编译过程 java-class的过程如下


image.png
image.png

dalvik和jvm的不用

1,加载文件的格式不同一个加载class,一个加载dex
2,jvm只能存在一个,dvm可以存在多个
3,dvm是基于寄存器的,jvm是基于栈的

art
dvm使用jit将字节码转换成机器码 效率低
art采用aot预编译技术,执行数据更快

你可能感兴趣的:(插件化,热修复基础之虚拟机)