作者:拍友2502914573 | 来源:互联网 | 2023-05-17 10:26
系列文章目录JVM:序文章目录系列文章目录前言运行时数据区模型图元空间基本类型信息运行时常量池字段信息方法信息静态变量指向ClassLoader的引用指向Class的引用方法表堆空
系列文章目录
JVM:序
文章目录
- 系列文章目录
- 前言
- 运行时数据区模型图
- 元空间
- 基本类型信息
- 运行时常量池
- 字段信息
- 方法信息
- 静态变量
- 指向ClassLoader的引用
- 指向Class的引用
- 方法表
- 堆空间
- 栈空间
- PC程序计数器
前言
在运行时数据区中,方法区,堆空间和本地方法栈是随jvm创建而创建销毁而销毁的,而栈空间和PC程序计数器是和线程一一对应的.
运行时数据区模型图
元空间
元空间用于存储加载类的类型信息
基本类型信息
- 类的全限定类名
- 直接超类的全限定类名
- 是接口类型还是类类型
- 修饰符
- 直接超接口的全限定类名列表
运行时常量池
常量池就是该类型所用常量的一个有序集合,包括直接常量和对其他类型,字段和方法的符号引用,可以通过索引访问常量池的内容
字段信息
方法信息
- 方法名
- 方法返回值类型
- 方法参数类型和数量(按声明顺序)
- 方法修饰符
- 方法声明顺序
- 方法字节码
- 操作数栈和该方法的栈帧中的局部变量区的大小
- 异常表
静态变量
不包括final修饰的编译时常量
指向ClassLoader的引用
指向Class的引用
方法表
方法表示一个数组,他的元素是所有实例可以调用的实例方法的直接引用,包括那些从超类继承过来的方法,这些方法全都是非私有的实例方法,如果子类有重写父类的方法那么原本在方法表中指向父类的指针就会指向子类
堆空间
堆空间存放着运行时创建的所有实例和数组,至于对象的具体存储形式是不确定的,但是必须保证对象能够访问到方法区中的类型信息,对象还有一个逻辑部分,其中包含对象的锁,每个对象都有一个锁,它被用于协调多线程访问同一个对象的同步.其中还包含一个等待集合,当一个线程被对象锁阻塞时就会被放到这个等待集合中,
栈空间
栈空间是以栈帧为单位保存数据的,在当前线程上执行的每个方法都对应着一个栈帧,该方法可以以两种方式结束,一种通过return正常返回,另一种通过抛出异常终止,不论哪种方式,jvm总会将当前栈帧时放掉.栈中存储的数数据是但钱线程独有的,任何线程都不能访问其他线程的栈数据
栈帧结构
局部变量表
它的大小在编译期就已经确定了,该区域是一个以变量槽为存储单位的从0开始计数的数组,字节码指令从零开始使用其中的数据,除了long和double会占用两个变量槽之外其他类型都占用一个,并且当byte,long,double存入时会转为int型,
操作数栈
该区域是一个以变量槽为存储单位的数组,但是它是通过标准的入栈出栈操作访问的,它的主要作用是作为执行引擎的工作空间,用于存储计算过程中的中间结果.
帧数据区
该区域用于存放支持常量池解析,正常方法返回以及异常派发的数据.
PC程序计数器
程序计数器是一个很小的内存空间,它总是存储着当前方法的jvm指令地址,如果正在执行的是本地方法那么它的值是不确定的.