JVM:一些基础知识准备
类加载机制
- Load:装载类信息
- ClassLoader:类加载器
- 双亲委派:加载器对一个类加载器会先让父类加载器加载,假如父类加载器找不到该类,才让子类加载器加载
- Linking:连接
- verify(验证):保证被加载类的正确性
- prepare(准备):为类的静态变量分配内存空间,变将其的值初始化默认值(0,0.0,null)
- resolve(解析):将类中的符号引用转换成直接引用
- 符号引用:classformat中的符号表示
- 直接引用:地址
- Initialization:初始化
- 为静态变量赋真正的值
- 使用
- 卸载
运行时数据区
方法区
方法区只有一个,生命周期与JVM相同。方法区内包含了运行时常量池(.class文件中的常量池,String常量池在堆中,不要混淆)
方法区线程共享,存储类的结构信息、常量、静态变量等。
方法区基本上不发生垃圾回收,容量不足时会抛出OOM。
1.7用永久代实现方法区,1.8用元空间(放在本地内存中)实现方法区。
堆
堆只有一个,生命周期与JVM相同。
堆线程共享,堆存储对象或者数组数据。
堆容量不足时会抛出OOM。
java虚拟机栈
虚拟机栈每个线程有一个,栈中存储栈帧,栈帧记录的是方法执行信息。
栈的深度不够用了会抛出StackOverFlowException,默认大小1M。
- 栈帧
- 局部变量表:方法中所有局部变量的列表
- 操作数栈:对数值操作的一个栈结构
- 动态连接:栈帧中保存了一个指向 运行时常量池中该栈帧所属方法的引用,方法在运行时将符号引用转换成直接引用(有一些符号引用在编译类文件时无法确定其真正的引用)
- 返回地址:方法被调用时的位置,有正常的地址和异常的地址
本地方法栈
和虚拟机栈类似
程序计数器
记录当前方法执行的行号,程序发生上下文切换时需要通过该行号返回到方法上次执行的位置。