静态常量池 存在于.class文件中,存放类的版本、字段、方法、接口的信息,同时还存放俩大常量:字面量(如字符串、申明为final类型的值)、符号引用,这部分将在类加载后进入方法区的运行时常量池存放。 符号引用包括:类和接口的全限定名、字段名称和描述符、方法名称和描述符 字面量包括:字符串、final修饰的常量、基本数据类型数值、其它 名词解释: 字面量:
java
代码在编译过程中是无法构建引用的,字面量就是在编译时对于数据的一种表示。int i = 1;//1便是字面量
符号引用:由于在编译过程中并不知道每个类的地址,因为可能这个类还没有加载,所以如果你在一个类中引用了另一个类,那么你完全无法知道他的内存地址,那怎么办,我们只能用他的类名作为符号引用,在类加载完后用这个符号引用去获取他的内存地址。 总结下就是:静态常量池即是存在于.class文件中的的常量池,即编译时期 运行时常量池 JVM在完成类的加载之后,将class文件中的常量池放入方法区(1.8元空间),其中包括静态常量池中的字面量和符号引用。其中符号引用替换成直接引用(就是地址值) 其中8种基本类型的包装类中有6种会存放在常量池种。那就是Byte、Boolean、Short、Integer、Long、Character。Double和Float暂时没有实现,但这6种类型的取值范围也仅限于-128-127
。
运行时常量池相对于class文件常量池(即静态常量池)的另外一个特性是具备动态性,java
语言并不要求常量一定只有编译器才产生,也就是并非预置入class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中。例如String的intern()方法。
字符串常量池
静态常量池中的字符串在类加载完成后会存放字符串常量池中,JDK1.7之前,字符串常量池存在于方法区,1.7迁移到堆中。同时迁入到堆的还有静态变量。1.8方法区改朝换代为元空间