JVM中的常量池和运行时常量池有什么区别

常量池存在于静态的存储文件[可以是任意的二进制流],主要包含着字面量和符号引用

运行时常量池存在于内存中,也就是常量池被加载到内存之后的版本,它的字面量可以动态的添加——string.intern(),符号引用可以被解析为直接引用

符号引用:符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可。符号引用与虚拟机内部的内存布局无关,引用的目标并不一定加载到内存中。各种虚拟机实现的内存布局可以各不相同,但是他们能接受的符号引用是相同的,因为符号引用的字面量形式明确定义在虚拟机规范的Class文件规范中
比如

public class C {
    public void f(){

    }
}

使用javap -v C.class,我们看该class文件中的常量池中f()的符号引用——#11
这里写图片描述
直接引用:直接引用可以是直接指向目标的指针、相对偏移量或是一个能间接定位到目标的句柄。直接引用是和虚拟机内存布局相关的,同一个符号引用在不同虚拟机实例上翻译出来的直接引用一般不会相同。如果有了直接引用,那引用的目标必定已经在内存中存在
比如

public class C {
    public void f(){

    }
}

直接引用是我们是看不到的,但是如果我们是用偏移量来表示,它可以是0x00000045[偏移量]

你可能感兴趣的:(JVM)