Java类从加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括,加载 ,验证 , 准备 , 解析 , 初始化 ,卸载 ,总共七个阶段。其中验证 ,准备 , 解析 统称为连接。
而在解析阶段会有一个步将常量池当中二进制数据当中的符号引用转化为直接引用的过程。
符号引用 :符号引用以一组符号来描述所引用的目标。符号引用可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可,符号引用和虚拟机的布局无关。个人理解为:在编译的时候一个每个java类都会被编译成一个class文件,但在编译的时候虚拟机并不知道所引用类的地址,多以就用符号引用来代替,而在这个解析阶段就是为了把这个符号引用转化成为真正的地址的阶段。
public class Test{
public static void main() {
String s=”adc”;
System.out.println(“s=”+s);
}
}
这个代码中在编译的时候对应的s会被解析成为符号引用,
public class Test{
public static void main() {
System.out.println(“s=”+”abc”);
}
}
而这段代码执行的时候会直接解析成直接引用。
直接引用 :直接引用和虚拟机的布局是相关的,不同的虚拟机对于相同的符号引用所翻译出来的直接引用一般是不同的。如果有了直接引用,那么直接引用的目标一定被加载到了内存中。
直接引用可以是:
1:直接指向目标的指针。(个人理解为:指向对象,类变量和类方法的指针)
2:相对偏移量。 (指向实例的变量,方法的指针)
3:一个间接定位到对象的句柄。