虚拟机解析

虚拟机解析


一、Java 虚拟机结构解析

JVM整体结构解析

Java 代码的编译和执行过程

编译流程

类加载器

加载流程

  • Loading:类的信息从文件中获取并且载入到 JVM 的内存里
  • Verifying:检查读入的结构是否符合 JVM 规范的描述
  • Preparing:分配一个结构用来存储类信息
  • Resolving:把这个类的常量池中的所有的符号引用改变成直接引用
  • Initializing:执行静态初始化程序,把静态变量初始化成指定的值

二、JVM 内存管理

从上面 JVM 结构图可以看到 JVM 内存空间由四个部分构成,分别是方法区、Java 堆、Java 栈、本地方法栈

Java 栈区

作用:它存放的是Java方法执行时所有的数据
组成:由栈帧组成,一个栈帧代表一个方法的执行
Java 栈帧
每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈
栈帧包含局部变量表、栈操作数、动态链接、方法出口

本地方法栈

作用:本地方法栈是专门为 native 方法服务的

方法区

存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后等数据

堆区

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

三、垃圾回收机制

垃圾收集算法

  • 引用计数算法 (缺陷:两个对象相互引用时)
  • 可达性算法

引用的类型

  • 强引用
  • 软引用(常用)
  • 弱引用(常用)
Object obj=new Object();
WeakReference<Object> wf=new WeakReference<Object>(obj);
obj=null;
wf.get();
  • 虚引用

垃圾回收算法

  • 标记-清除算法
  • 复制算法
  • 标记-整理算法

触发回收

  • Java 虚拟机无法再为新的对象分配内存空间
  • 手动调用System.gc()方法(强烈不推荐)
  • 低优先级的 GC 线程,被运行时就会执行 GC

四、Dalvik与 JVM的区别

  • 执行文件不同
    JVM执行的是.class 文件,Dalvik VM 执行的是.dex 文件
  • DVM类加载的系统与 JVM区别较大
  • 可以同是存在多个 DVM
  • Dalvik VM 是基于寄存器,JVM 是基于栈

五、Dalvik 与ART 的区别

  • DVM使用JIT来讲字节码转换成机器码,效率低
  • ART 采用了 AOT预编译技术,执行速度更快
  • ART 会占用更多的应用安装时间和存储空间(以空间换时间)

你可能感兴趣的:(Android热修复与插件化)