以下都是我自己的了解,有错的地方可以指出谢谢
首先我们要了解每个线程在执行的过程中都会有属于自己的单独的虚拟机栈,同时执行每一个方法都会在虚拟机栈中有一个对应的栈帧,每一个栈帧中都会有同样的一套东西:
1.操作数栈
简单来说就是处理局部变量的运算以及临时存放结果的一块内存。
2.局部变量表
局部变量表的话就不陌生了,每个方法都会定义许多的局部变量,局部变量表就是存放这些数据的一块内存。
3.动态链接
正常情况下字节码文件中的方法的调用指令是以常量池中指向方法的符号引用作为参数。这些符号引用一部分会在类加载阶段或第一次使用时转化为直接引用。
这里我们可以从多态的角度去思考,当你创建一个子类对象指向父类引用,这个时候调用对象的方法的时候只有在运行时我们才知道是调用的子类的方法。
所以这部分字节码文件中的方法的调用指令指向该方法在运行时常量池中的位置,通过运行时常量池中的符号引用(这个引用指向的是堆),将这个符号引用转化为直接引用。
4.方法出口
方法出口就好理解了,当我们这个方法对应的栈帧结束之后,会记录我们之前执行这个方法的时候对应的代码在方法区中的位置,以便我们的程序在执行完某个方法的时候可以接着执行下去。