JVM结构解析
编译流程
类加载器
加载流程
Loading:类的信息从文件中获取并且载入到JVM的内存里
Verifying:检查读入的结构是否符合jvm规范的描述
Preparing:分配一个结构用来存储类信息
Resolving:把这个类的常量池中的所有的符号引用改变成直接引用
Initializing:执行静态初始化程序,把静态变量初始化成指定的值
JVM内存管理
Java栈区
作用:它存放的是java方法执行时的所有的数据
组成:由栈帧组成,一个栈帧代表一个方法的执行
作用:
每个方法从调用到执行完成就对应一个栈帧在虚拟机栈中入栈到出栈。
局部变量表、栈操作数、动态链接、方法出口。
本地方法栈
作用:本地方法栈是专门为native方法服务。
方法区
存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后等数据。
堆区
作用:所有通过new创建的对象的内存都在堆中分配。
特点:是虚拟机中最大的一块内存,是GC要回收的部分。
堆区内存:
垃圾收集算法
引用记数算法
可达性算法
引用的类型
强引用、软引用、弱引用、虚引用
常用:强引用、弱引用
Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();
垃圾回收算法
标记-清除算法
复制算法
标记-整理算法
jvm中三种算法结合使用。
触发回收
jvm无法再为新的对象分配内存空间了
手动调用System.gc()方法(强烈不推荐)
低优先级的GC线程,被运行时就会执行GC
Dalvik与JVM的不同
Dalvik VM:
执行的文件不同:一个是class,一个dex
类加载的系统和jvm区别较大
可以同时存在多个DVM
Dalvik是基于寄存器的(寄存器比内存更快的一个存储介质),jvm是基于栈的
ART比Dalvik的优势
DVM使用JIT来将字节码转换成机器码,效率低
ART采用了AOT预编译技术,执行速度更快
ART会占用更多的应用安装时间和存储空间
总结
对jvm整体结构有一个深入了解
对jvm的内存管理有个深入了解
对jvm的垃圾回收有个一个较深入的了解