jvm-线程私有区域
程序计数器、虚拟机栈、本地方法栈跟线程的声明周期是一样的
程序计数器
程序计数器用于记录当前线程下虚拟机正在执行的字节码的指令地址
特性
- 线程私有:多线程情况下,在同一时刻为了让线程切换后依然能恢复到原位,每条线程都需要有各自独立的程序计数器
- 没有规定OutOfMemoryError:程序计数器存储的是字节码文件的行号,而这个范围是可知晓的,在一开始分配内存时就可以分配一个绝对不会溢出的内存
- 执行native方法时值为空:native方法大多是通过c实现,并未编译成需要执行的字节码指令,也就不需要去存储字节码文件的行号了
虚拟机栈
方法的出入栈:调用的方法会被打包成栈帧,一个栈帧至少要包含一个局部变量表、操作数栈、帧数据、动态连接。
动态连接
当栈帧内部包含一个指向运行时常量池引用前提下,类加载时候会进行符号引用知道直接引用的解析跟连接替换
局部变量表
局部变量表是栈帧重要组成部分之一。他主要保存函数的参数以及局部的变量信息。局部变量表中的变量作用域是当前调用的函数。函数调用结束后,随着函数栈帧的销毁。局部变量表也会随之销毁,释放空间
操作数栈
保存着java虚拟机执行过程中数据
方法返回地址
方法被调用的位置,当方法退出时实际上等同于当前栈帧出栈
本地方法栈
跟虚拟机栈类似,只是为使用到的native方法服务而已