JVM虚拟机 的方法区(从gc的角度讲其中的永久代(持久代))
JVM虚拟机的方法区
特别的
常量池
class中的常量池
我们都知道,class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table);
用于存放编译器生成的各种**字面量(Literal)和符号引用(**Symbolic References)。 字面量就是我们所说的常量概念,如文本字符串、被声明为final的常量值、基本数据类型等。 符号引用是一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能无歧义地定位到目标即可(它与直接引用区分一下,直接引用一般是指向方法区的本地指针,相对偏移量或是一个能间接定位到目标的句柄)。一般包括下面三类常量:
类和接口的全限定名
字段的名称和描述符
方法的名称和描述符
常量池的每一项常量都是一个表,一共有如下表所示的11种各不相同的表结构数据,这每个表开始的第一位都是一个字节的标志位(取值1-12),代表当前这个常量属于哪种常量类型。 每种不同类型的常量类型具有不同的结构,具体的结构本文就先不叙述了,本文着重区分这三个常量池的概念(读者若想深入了解每种常量类型的数据结构可以查看《深入理解java虚拟机》第六章的内容)。

它是Class文件中的内容,还不是运行时的内容,不要理解它是个池子,其实就是Class文件中的字节码指令
运行时常量池

当java文件被编译成class文件之后,也就是会生成我上面所说的class常量池,那么运行时常量池又是什么时候产生的呢?

jvm在加载某个类的时候,必须经过装载、连接、初始化,而连接又包括验证、准备、解析三个阶段。而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。在上面我也说了,class常量池中存的是字面量和符号引用,也就是说他们存的并不是对象的实例,而是对象的符号引用值。而经过解析(resolve)之后,也就是把符号引用替换为直接引用,解析的过程会去查询全局字符串池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与全局字符串池中所引用的是一致的。

相关文章:

  • 2021-07-19
  • 2021-07-16
  • 2021-10-04
  • 2021-08-22
  • 2021-07-04
  • 2021-09-30
  • 2021-05-29
猜你喜欢
  • 2021-12-15
  • 2021-09-23
  • 2021-05-29
  • 2021-04-28
  • 2021-04-26
  • 2022-12-23
  • 2021-05-17
相关资源
相似解决方案