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。

  • 栈帧
    • 局部变量表:方法中所有局部变量的列表
    • 操作数栈:对数值操作的一个栈结构
    • 动态连接:栈帧中保存了一个指向 运行时常量池中该栈帧所属方法的引用,方法在运行时将符号引用转换成直接引用(有一些符号引用在编译类文件时无法确定其真正的引用)
    • 返回地址:方法被调用时的位置,有正常的地址和异常的地址
本地方法栈

和虚拟机栈类似

程序计数器

记录当前方法执行的行号,程序发生上下文切换时需要通过该行号返回到方法上次执行的位置。

Java对象布局

原文地址:https://www.cnblogs.com/fcb-it/p/13341252.html