JVM运行时数据区可分为线程共享的堆,方法区和线程独享的虚拟机栈、本地方法栈、程序计时器此外还有一个单独的直接内存,如下图所述:
程序计数器(Program Counter Register)也叫PC寄存器,每个线程会通过程序计数器记录当前要执行的的字节码指令的地址。
ps:因为每个线程只存储一个固定长度的内存地址,程序计数器是不会发生内存溢出的。
Java虚拟机栈(Java Virtual Machine Stack)采用栈的数据结构来管理方法调用中的基本数据,先进后出(First In Last Out),每一个方法的调用使用一个栈帧(Stack Frame)来保存。
如下执行main时相关的java虚拟机栈如下:
?Java虚拟机栈随着线程的创建而创建,而回收则会在线程的销毁时进行。由于方法可能会在不同线。程中执行,每个线程都会包含一个自己的虚拟机栈。
槽覆盖特性,即当某一局部变量不再生效时,当前槽可以重写被再次使用。
动态链接
当前类的字节码指令引用了其他类的属性或者方法时,需要将符号引用(编号)转换成对应的运行时常量池中的内存地址。动态链接就保存了编号到运行时常量池的内存地址的映射关系。
方法出口
方法出口指的是方法在正确或者异常结束时,当前栈帧会被弹出,同时程序计数器应该指向上一个栈帧中的下一条指令的地址。所以在当前栈帧中,需要存储此方法出口的地址。
异常表
主要作用是存放代码正常执行和出现异常时字节码指令如何进行跳转的数据
?