您的位置 首页 java

JVM-class常量池详细解读

引言

依稀记得在刚开始学习java的时候,总是遇到一些关于String不能使用“+”进行拼接, 字符串 拼接必须使用string buffer,字符串的最大长度是多少;当 int i = 127;int j=127时,j和i对象是相等的吗?为了了解这些问题,只能强行记下一堆无法理解的概念知识,实际以背完后仍然云里雾里,今天就写一篇关于java常量池的文章,彻底的解决这些麻烦问题 。知识比较简单,作为这10天以来回顾 JVM 内容的最后一篇文章吧。

何为常量池

众所周知,java文件必须编译成class文件后,jvm才能读取运行,而class文件中除了包含类的版本信息、字段、方法名、接口等信息外,还有一项非常重要的东西就是常量池了。常量池主要是用于存放编译器生成的 字面量(Literal)和符号引用(Symbolic References)

  • 字面量:即赋值代码中,等号右侧的值,比如数字或者一些字符串等
  • 符号引用:包括类和接口的名称、字段的名称、方法的名称三类

class文件的常量池信息可以通过javap -v 命令生成可视化的字节码文件,如下图,可以看到类型、方法名称都属于常量池的信息

JVM-class常量池详细解读

class文件常量池信息

以上描述的就是网上常说的静态常量池,静态常量池可以在某种程度上理解为JVM生成的描述性语言,还有被大家提及的很多的一点是运行常量池。

运行时常量池

当class文件被加载运行至JVM内存时(此过程不理解的可以看看 ),这些静态信息就会存在对应内存地址信息,比如某 静态变量 对应方法区指针、方法对应代码区间等信息需要存入内存(jdk1.8版本及以后,常量池存在元空间也是方法区中)中,这些常量池此时就变成运行时常量池了,对应的符号引用在此刻会被转化为直接引用。

字符串常量

字符串的内存分配需要耗费非常多的时间和空间,作为java的基础数据,如果大量频繁的创建字符串,会极大的影响系统的整体性能。因此JVM在字符串实例化的时候做了一些优化,一定程度地提高了其性能且降低了字符串使用的内存开销。

  • 为字符串在方法区开辟了一个字符串常量词,用于字符串的缓存
  • 创建字符串时,会先从常量池中查询该字符串,如果常量池存在,则返回字符串实例引用指针
  • 如果常量池不存在此字符串,则会先在常量池中实例化此字符串,再返回此实例化引用

根据以上规则,项目规范要求字符串拼接不能使用“+”进行拼接就比较深入了解了吧?下面的字符串判断就不用多讲了(●ˇ∀ˇ●)

JVM-class常量池详细解读

String字符串常见判断

另外就是java基本类型的常量类大部分也实现了常量池功能,不过double和 float 没有实现,诗经实现的包装类只有对应值不大于127时,才会在常量池中创建对象。

好了,以上就是class常量池的所有内容了,JVM的内容的回顾也在此暂时告一段落了[鼾睡]

文章来源:智云一二三科技

文章标题:JVM-class常量池详细解读

文章地址:https://www.zhihuclub.com/200312.shtml

关于作者: 智云科技

热门文章

网站地图