1.1运行时数据区
文章目录
1.JVM结构(运行时数据区+执行子系统)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q8pmbV7d-1686273854295)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220228174243174.png)]
2.程序计数器(线程私有)
1.作用:存储线程正在执行的指令地址,用于记录线程执行到了哪里
2.问题:
- 为什么要有pc寄存器:(作用)
- 为什么pc寄存器是线程私有:为了准确记录每一个线程执行到了哪里
3.特点:不存在GC和OOM问题
3.虚拟机栈(线程私有)
“栈管运行,堆管存储,但并不是说栈就不能存储”。比如逃逸分析-栈上分配,基本数据类型都是分配在java栈上
(1)基础知识
-
定义:每一个线程被创建后时都会创建一个虚拟机栈,内部保存着一个个栈帧,对应一个个方法调用
-
基本单位:栈帧
-
生命周期:和线程生命周期一致
-
特点:不存在GC问题,但存在OOM问题
-
运行原理:执行引擎只执行当前栈帧1[^ 2]。
(2)栈帧
包括局部变量表,操作数栈,动态链接,方法返回地址
①局部变量表
- 定义:是一个数组,存放编译期间可知的基本数据类型+对象引用+返回地址类型。局部变量表的大小(即slot数量)在编译期间当进入方法时就完全确定好了,局部变量表的大小由Slot数量决定
- 基本单位:Slot变量槽
- 变量槽中除了long和double占2个槽位外,其余所有都占1个槽位
- JVM为每一个Slot分配在局部变量表中的索引,从0开始
- 如果当前栈帧是由构造方法或者非static方法创建的,则会把this放在索引0的槽位
- 如果一个变量表过了其作用域,之后有新的变量进来会复用过期槽位(因为数组空间已经开辟)
②操作数栈
- 定义:在方法执行过程中,根据字节码指令把局部变量表中变量槽里的数据在操作数栈中入栈/出栈
③动态链接
- 定义:指向方法区中的运行时常量池的方法引用。即明确当前栈帧对应的方法到底是哪个方法
④方法返回地址
- 定义:存放调用该方法的pc寄存器的值。即明确当前方法执行到了哪
4.本地方法栈(线程私有)
-
作用:虚拟机栈为虚拟机执行java方法服务。本地方法栈为虚拟机执行native方法服务
-
特点 :不会有GC问题,但会有OOM问题(和虚拟机栈一样,在创建或者扩展失败时,就会报OOM)
5.堆(线程共享)
- 定义:每一个java进程创建时都会创建一JVM,一个JVM一个堆内存。保存几乎所有(因为存在逃逸分析栈上分配)对象实例和数组+字符串常量池+静态变量
- 结构划分:经典分代结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mgwQmuyP-1686273854296)(C:\Users\10059\AppData\Roaming\Typora\typora-user-images\image-20220302101151130.png)]
- 特点:存在GC和OOM
6.方法区(线程共享)
-
定义:每一个java进程创建时都会创建一JVM,一个JVM一个方法区(之前叫永久代) 。存放类型信息,运行时常量池**(JDK7开始把里面的字符串常量池移到堆),静态变量(JDK7开始移到堆)**,即时编译器-JIT缓存。又被称为“.class文件的仓库”
-
结构划分:类型信息^ 6.1+运行时常量池(存放直接引用^ 6.2 )+即时编译器-JIT缓存
注意事项:常量池和final没有直接关系
-
特点:存在GC和OOM
mage-20220302161104944.png" alt=“image-20220302161104944” style=“zoom:67%;” /> -
特点:存在GC和OOM
线程当前调用的方法叫做当前栈帧。方法里会调用其它方法,此时就会有新的栈帧入栈成为当前栈帧。
[^ 2]: 当前栈帧执行结束后会将返回结果传递给下一层栈帧。何时结束?①方法正常返回②遇到异常结束,那么会看当前栈帧是否处理,如果没法处理则会抛给上一层栈帧,看它是否处理,如果仍然不处理则继续往上抛。
[^ 1]: ↩︎