page contents

class文件常量池,字符串常量池和运行时常量池

Pack 发布于 2020-02-11 17:18
阅读 443
收藏 0

class文件常量池,字符串常量池和运行时常量池,三者有什么区别和联系?运行时常量池是不是包含字符串常量池的?



class A{ static String a="aa"; staitc final String b="bb"; static int c=1; static final int d=2;

}

A类中的a,b,c,d三个属性分别放在哪个池里的?

317
Pack
Pack

可以参考下https://blog.csdn.net/xiao______xin/article/details/81985654

全局字符串池(string pool)里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的。)
常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。 字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值等。
jvm在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中

1.全局常量池在每个VM中只有一份,存放的是字符串常量的引用值。
2.class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量的符号引用。
3.运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。

请先 登录 后评论