java常量池:字符串常量池,静态常量池,运行时常量池,

转载自:https://blog.csdn.net/qq_25825923/article/details/84972256

 

字符串常量池(String Poll)

  • java6:
    • 存在于永久代中。
    • 字符串常量池保存的是字符串常量。
  • java7:
    • 转移到了堆中。
    • 字符串常量池存的是字符串常量和堆内的字符串对象的引用。

静态常量池

zld自身理解:java编译后生成的.class文件的中那些字面量的常量池。。这个常量池是存在.class文件中的,用Constant pool指定。当.class被加载进jvm中后,Constant pool中的常量(类的包,如com.example.xxxClass这个字符串)会被放到运行时常量池中,如果运行时常量池中已经存在该字符串,则直接使用常量池中的该字符串的引用。类似于String.intern方法的作用。

 

用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)。
字面量:               文本字符串int long 等基本类型和被声明为final的常量值等。

符号引用:           是一组符号来描述所引用的目标,符号可以是任何形式的字面量一般包含以下三种:

类和接口的全限定名:例如对于String这个类,它的全限定名就是java/lang/String。
字段的名称和描述符:这里的字段就是类或者接口中声明的变量。
方法的名称和描述符:这里的描述符是方法的参数类型+返回值类型。
静态常量池其实就是class文件里的一部分内容。以下图片是编译后的class文件。
 

å¨è¿éæå¥å¾çæè¿°

运行时常量池

当类加载到内存中后,jvm就会将静态常量池中的内容存放到运行时常量池中。
运行时常量池中的字符串在从静态常量池加载时
会先去String Poll中查询此此字符串在String Poll中的引用
如果没有则在String Poll中创建此字符串然后返回其引用
用返回的引用替换运行时常量池的字符串
运行时常量池是全局共享的,多个类共用一个运行时常量池。并且class文件中常量池多个相同的字符串在运行时常量池只会存在一份
 

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