运行时数据区(三)
2020-04-01 本文已影响0人
salix_
一:总示:
JVM标准规定的运行时数据区
现在真实的HotSpot运行时数据区(JDK1.8以及之后的图,JDK1.8之前不叫元空间,叫永久代)
二:线程和进程在JVM中以及和运行时数据区的空间的关系
1. 线程进程:
- JVM是一个进程
- 我们写一个java程序开启的是线程,所有的线程都包含在JVM这个线程中。
2.线程进程 和 运行时数据区的空间的关系:
- 每一个线程对对应的都有自己的程序计数器、本地方法栈、虚拟机栈
-
方法区和堆是线程共有的,也就是随着JVM生或死。(堆和方法区是线程公用的)
三:程序计数器
1.作用:
每个线程都有,记录每个线程自己下一步执行的指令的位置(如果使用的是native方法,寄存器不指定值)。其实就是操作系统线程的PC。
2.是java唯一没有OutOfMemeyError的运行时数据区
四:虚拟机栈
1.定义?
每个java线程被创建的时候,都会创建一个虚拟机栈,里面保存栈帧,对应着一个个方法的调用。
2.作用:
主管java程序的使用, 保存方法的局部变量(基本数据类型+对象类型的引用)、部分结果、并参与方法的调用和返回。
3.是否固定栈大小分别对应的异常
4.一个栈帧包含
1. 局部变量表:
通过定义一个数字数组,来存储方法参数和定义在方法体内的局部变量//如果是非static方法,会加一个对象的引用this。在每个栈帧第0哥slot的地方。
2. 操作数栈:
- 在方法执行的过程中,根据字节码指令的执行过程,数组进栈或出栈。是用来做加减乘除等操作的。
- 如果A调用B,B有返回值,B的返回值会放到A的操作数栈中。(B返回后,A的字节码指令会先把返回值放在A的操作数栈)
3. 动态链接:
.class文件被记载到内存之后,所有的方法、属性都在常量池之中,有一个编号,字节码里都是对运行时常量池里面的东西的引用。动态链接就是字节码指令真正执行的时候,将对常量池中方法、属性、类等的间接引用变成直接引用。
4. 方法返回地址:
存了一个pc寄存器的值,可以直接返回。
5. 一些附加信息:(不重要)
例如对程序调试提供支持。