JAVA中常量池、运行时常量池和串池的区别

文章目录

  • 一 常量池的作用
    • 1.1 字面量
    • 1.2 符号引用
  • 二 运行时常量池
  • 三 字符串常量池

一 常量池的作用

每一个class文件都有一个常量池,常量池保存着class的常量信息:字面量和符号引用。通俗来说,常量池就是class文件中的资源仓库,保存了文件运行时需要的常量信息,这些常量都是开发者定义出来的。
我们知道,每一个class文件都是javac编译来的,在编译过程中,java并没有保存方法、字段的内存布局,在运行时必须加载解析这些常量信息才能够将其翻译到具体的内存地址加以使用。

1.1 字面量

通俗的讲,字面量就是由字母、数字构成的字符串或数值。且字面量只可以右值出现,例如 a = 123, 123就是字面量。在这里要注意,编译后运行前,字符串也是字面量,也会存在常量池中,只不过这里的常量池就像个静态池。

1.2 符号引用

符号引用是编译原理中的概念,是相对于直接引用来的,主要包括以下三类常量:类的全限定名,字段的名称和描述符以及方法的名称和描述符。简单来说,就是存储了类和方法的入口信息。方便运行时加载入实际内存中。
类的全限定名:就是类名全称,带包路径的,用点隔开,例如java.lang.String
字段的名称和描述符:这里的难点在于字段是什么?字段和属性不同,其实就是类变量(static修饰的变量)
方法的名称和描述符:这个很好理解,就是方法名,修饰符,参数

二 运行时常量池

与常量池一样,每一个class在加载时都会有一个对应的运行时常量池,将方法区/元空间的常量池中的class文件加载进来时,常量池中的信息也会放到运行时常量池中,要注意的一点是,常量池中的字符串数据会被放到串池中(字符串常量池)

三 字符串常量池

就是在运行时保存字符串的池子,被放在堆中,而且全局唯一,这是和常量池与运行时常量池不一样的地方。之所以这么设计,是因为字符串不可更改,线程安全,因此可以共用,减少开销。

你可能感兴趣的:(java,java,jvm)