美文网首页
JVM常量池

JVM常量池

作者: 爱健身的兔子 | 来源:发表于2021-04-13 14:52 被阅读0次

1 Class常量池

.java文件通过编译器编译后会生成.class(字节码)文件。class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。内容如下:


注意:
上面的final修饰的常量是static的,不是实例变量。

2 字符串常量池

全局字符串池里的内容是在类加载完成,经过验证,准备阶段之后在堆中生成字符串对象实例,然后将该字符串对象实例的引用值存到string pool中(记住:string pool中存的是引用值而不是具体的实例对象,具体的实例对象是在堆中开辟的一块空间存放的。)。 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个哈希表,里面存的是驻留字符串(也就是我们常说的用双引号括起来的)的引用(而不是驻留字符串实例本身),也就是说在堆中的某些字符串实例被这个StringTable引用之后就等同被赋予了”驻留字符串”的身份。这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。

3 运行时常量池

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

class常量池、字符串常量池和运行时常量池的区别那年那些事儿-CSDN博客运行时常量池和字符串常量池的区别

相关文章

  • JVM-常量池

    JVM-常量池 JVM常量池分为 Class文件常量池 运行时常量池 全局字符串常量池 基本类型包装类对象常量池 ...

  • java基础类型、String类理解、版本对比、1.8新特性

    1、java基本数据类型及长度 2、jvm的常量池: JVM常量池浅析Java常量池理解与总结 Java中的常量池...

  • 彻底弄懂java中的常量池

    JVM有几种常量池 主要分为: Class文件常量池、运行时常量池,全局字符串常量池,以及基本类型包装类对象常量池...

  • JVM常量池

    1 Class常量池 .java文件通过编译器编译后会生成.class(字节码)文件。class文件中除了包含类的...

  • 深入浅出JVM常量池

    常量池在JVM中分为三种:字符串常量池,运行时常量池,Class常量池讨论范围 JDK 1.7版本及以后 字符串常...

  • JVM(六)JVM常量池

    1.常量池类型 Java中的常量池分为三种: 类文件常量池(静态常量池)(The Constant Pool)运行...

  • JVM-常量池

    1,(全局)字符串常量池(String Constant Pool) 1)使用sun.jvm.hotspot.me...

  • JVM常量池浅析

      需要说明的一点是,这篇文章是以《深入理解Java虚拟机》第二版这本书为基础的,这里假设大家已经了解了JVM的运...

  • int和Integer的区别(equals和==)

    在这里,我首先讲一下常量池的概念和在jvm里面内存存储情况。 1:常量池(constant pool),指基本数...

  • 由“String不可变”引发的一些思考

    字符串常量池 ​ JVM为了字符串的服用,减少字符串对象的重复创建,特别维护了一个常量池。 ​ jdk1....

网友评论

      本文标题:JVM常量池

      本文链接:https://www.haomeiwen.com/subject/knqclltx.html