获得徽章 0
- jvm的运行时数据结构.(一)
一.程序计数器
1.程序计数器是一块较小的内存空间,可以看作是当前线程执行字节码的行号。
2.是线程私有的内存。
3.唯一一个没有规定OutOfMemoryError异常的内存区域。
二.java虚拟机栈
1.是线程私有的内存。
2.如果栈不支持动态扩展他可能会抛出StackOverFlowError,如果支持动态扩展可能会抛出OutOfMemoryError。
3.每个方法的开始到结束对应一个栈帧在虚拟机栈入栈帆出栈的过程,虚拟机栈只有栈顶的栈帧有效,称为当前栈帧,对应的方法称为当前方法!栈帧主要包括,局部变量表,操作数栈,动态链接和方法出口等信息。
(1)局部变量表主要存储方法参数和方法内的局部变量。
(2)局部变量表中的数据,由于是线程私有的,所以不存在线程安全的问题。
(3)虚拟机是使用局部变量表完成参数值到参数变量列表传递的过程,如果执行的是实例方法,第0位是方法所属实例对象的引用,可以通过this关键字引用到,其余方法参数按照顺序继续存储,存完将方法中的局部变量在按照顺序进行存储。
(4)局部变量表中的空间是可以重用的,也就是说超过了变量的作用域,也就是超过了pc寄存器的值,那么变量我们可以重用其内存空间!
(5)局部变量表中的变量必须赋初始值以后才可以使用,类变量有准备(后续会讲)的过程,所以如果不赋值,默认值为0.
(6)操作数栈还没有想好措辞暂不介绍。
(7)动态链接,每个栈帧都有一个该方法所求引用,为了支持方法调用时动态链接。
(8)方法调用传递的是字节码中的符号引用,如果在类加载阶段或者第一次使用的时候转化为直接引用,这种称为静态解析,如果在运行的过程中转化为直接引用称为动态链接。
(9)退出一个方法有两种方法,字节码指令遇到任意返回指令时!另一种是遇到异常,并且没有匹配到异常处理器时!
(10)方法退出等于当前栈帧出栈,并且恢复上层方法的局部变量表和操作数栈,并且把返回值压入调用者操作数栈中,调整pc寄存器的值!
由于字数限制,先写这么多,欢迎大家批评指正展开评论1