一、了解Class文件
1.什么是classs文件
能够被jvm识别的、与硬件无关的字节码格式文件。
2.class文件的作用
- java跨平台的原因
- 用来记录一个类文件所有的信息。比.java源代码记录的信息要多的多,之所以我们能用super.方法,就是因为.class文件记录了该类的所有信息。
3.如何生成class文件
- 使用javac 命令去生成class文件
- 通过IDE自动帮我build生成(实际还是用的javac命令)
4.class文件结构
- 是一种8位字节的二进制流文件
- 各个数据按顺序紧密排列,没有间隙
- 每个类或接口都单独占据一个class文件
5.class文件的弊端
- 占用内存大,不适合移动端
- 堆栈加载模式,加载速度慢
- 文件IO操作多,类查找慢
二、Dex文件
1.什么是dex文件
能够被DVM识别,加载并执行的文件格式
2.如何生成一个dex文件
- 通过dex命令去生成dex文件
- 通过IDE自动帮我们build生成
3.dex文件的作用
记录整个工程中所有类文件的信息
4、dex文件结构
- 8位字节的二进制流文件
- 数据紧密排列,无间隙
- 整个应用中所以的源文件都放在一个dex中
三、Dex和Class文件的异同
- 都是没有间隙的二进制文件流
- 都是由java源代码演变而来,dex又是由class文件演变而来的
- class存储了许多冗余信息,而dex文件统一规划来达到复用效果实现体积减小
四、Java虚拟机
1、JVM整体结构

java编译器将源代码编译成字节码,即class文件;类加载器系统通常就是指类加载器,类加载器再将class字节码加载到内存中;
2、Java代码的编译和执行过程

3.JVM垃圾收集器
内存空间
1、java栈区
- java栈区存放的是java方法的所有的数据 -- 栈区由战帧组成,一个栈帧代表一个方法的执行
- 每个方法从调用到执行完成就对应一个栈帧在虚拟机中入栈到出栈
- 每个栈帧包含了局部变量表、栈操作数、动态链接、方法出口
2、本地方法栈
本地方法栈是专门为native方法服务的,也是通过栈帧来记录方法的调用的。
3、方法区
存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后等数据。方法区是永远占据内存的
4、堆区
- 所有通过new创建的对象的内存都在堆区中分配
- 堆区是虚拟机中最大的一块内存,是GC要回收的部分
垃圾回收
1.垃圾对象判定算法
- 引用计数算法
缺陷:会陷入互相引用导致无法释放内存
public class A{
public B bInstance;
}
public class B{
public A aInstance;
}
public static void main(String[] args){
A a = new A();
B b = new B();
a.bInstance = b; //陷入相互引用导致无法释放内存
b.aInstance = a;
}
- 可达性算法
2.垃圾对象回收算法
- 标记清除法
- 复制法
- 标记整理算法