栈帧与操作数栈剖析及符号引用与直接引用的转换
- 栈帧
- 栈帧是一种用于帮助虚拟机执行方法调用与方法执行的数据结构。
- 栈帧本身是一种数据结构,封装了方法的局部变量表、动态链接信息、方法的返回地址以及操作数栈等信息。
- 注:栈帧其实是归属于一个一个的线程的,一个线程只会拥有独有的一份栈帧结构,因此栈帧不存在所谓的并发调用的情况。
-
public class MyTest4 { private void test(){ int a = 3; if (a<4){ // 对b,c来说,生命周期只存在于if,if结束就会被GC回收,而b,c的slot可能会被 // 后面的d,e所使用(slot是否会被使用,有JVM所决定)。 int b = 5; int c = 6; } int d = 7; int e = 8; } }
- 符号引用与直接引用:
- 如:在Java中,存在两个类:A类、B类,A类存在对B类的方法调用,那么在编译期间,即静态时刻,A对B的方法调用,它们这种地址关系实际上是不知道的。什么时候才能知道?两种情况:①在类加载的时候才可以知道这种关系,②只有当真正开始调用的时候才能唯一确定目标调用的方法的地址是什么。由此引入了两个概念:符号引用与直接引用。
- 符号引用:
- ①有些符号引用是在类加载阶段或是第一次使用时就会转换为直接引用,这种转换叫做静态解析;②另外一些符号引用则是在每次运行期转换为直接引用,这种转换叫做动态链接,这体现为Java的多态性。
-
//代码中 a 虽然是指向了不同的实例(这种指向只有动态运行期的时候才能识别出来),但是,在字节码文件中(程序编译时候),看到的这个a都是调用了Animal的实例。 Animal a = new Cat(); a.sleep(); a = new Dog(); a.sleep(); a = new Tiger(); a.sleep();