(1)JVM结构
(2)编译流程
(3)类加载器
BootStrap classloader和Extension ClassLoader是加载jdk中的类。
AppClassLoader 加载app中的类
Custom ClassLoader :自定义类加载器 。实现动态加载。
(4)类加载器的加载流程
Loading:类的信息从文件中获取并再入到JVM的内存里。
Verifying:检查读入的结构是否复合JVM规范的描述
Preparing:分配一个结构用来存储类信息
Resolving:把这个类中的常量池中的所有的符号引用改变成直接引用
Initializing:执行静态初始化程序,把静态变量初始化成指定的值
(5)Java栈区:
作用:它存放的是Java方法执行时的所有的数据
组成:由栈帧组成,一个栈帧代表一个方法的执行
Java栈帧
每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈
包含内容:局部变量表,栈操作数、动态连接、方法出口
(6)本地方法栈
作用:本地方法栈是专门为native方法服务的
(7)方法区
存储被虚拟机加载的类信息、常量、静态变量、编译器后等数据
(8)堆区
作用:所有通过new创建的对象的内存都在堆中分配
特点:是虚拟机中最大的一块内存,是GC要回收的部分。
堆区内存的示意图
(9)垃圾回收
垃圾收集算法
1、引用计数算法 :计数为0时,会被回收。
2、可达性算法:
3、标记-清除算法
4、复制算法
5、标记整理算法
6、触发回收
Java虚拟机无法再为新的对象分配内存空间了。
手动调用System.gc()方法
低优先级的GC线程,被运行时就会执行GC
Dalvik VM 与Java 虚拟机
执行的文件不同,一个是class,一个是dex
类加载的系统与JVM区别较大
可以同时存在多个DVM
Dalvik是基于寄存器,而JVM是基于栈的
ART
DVM使用JIT来将字节码转换成机器码,效率低
ART采用了AOT预编译技术,执行速度更快
ART会占用更多的应用安装时间和存储空间