class常量池和运行时常量池的区别
class常量池
一个java源文件的类,接口,编译后会产生一个字节码文件。而Java中的字节码需要数据支持,通常这种数据会很大以至于不能直接存到字节码里,换一种方式,可以存到常量池中,这个字节码包含了指向常量池的引用。在动态链接的时候会用到运行时常量池。可以包括:数量值,字符串值,类引用,字段引用,方法引用。
总结:常量池可以看作是一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等类型。
运行时常量池
运行时常量池是方法区一部分,在加载类和接口到虚拟机后,就会创建对应的运行时常量池,会将常量池的部分内容存放到运行时常量池中。在创建的过程中,如果构建所需的空间超过方法区所能提供的最大值,就会报OOM。运行时常量池中包含了多种不同的常量,包括编译期的数值字面量,也包括到运行期解析后才能获取的方法或者字段引用,此时已经是真实地址,它具有动态性。