Java 常量池:静态常量池 动态常量池 字符串池

Java 常量池相关内容


Java 常量池概念分类:静态常量池、动态常量池、字符串常量池(由于jdk1.7之后字符串常量池从运行时常量池分离到堆中)

静态常量池


  • class 文件中
  • CLass文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用

Java 常量池:静态常量池 动态常量池 字符串池_第1张图片 

 运行时常量池


  • jvm 方法区(类型信息、字段方法、符号引用) + 堆(字符串常量池、静态变量)
    Java 常量池:静态常量池 动态常量池 字符串池_第2张图片

  • 静态常量池的内容将在类加载后进入方法区的运行时常量池中存放

  • 运行时常量池是每个类都有一个 

字符串常量池


堆中,1.7之后不属于运行时常量池,每个 jvm 只有一个

字面量 何时进入常量池?

Java 常量池:静态常量池 动态常量池 字符串池_第3张图片

new Strin g(“abc”) 创建了几个对象? 

Java 常量池:静态常量池 动态常量池 字符串池_第4张图片

StringTable :字符串常量池的实现结构

  • 底层 HashTable ,数组+链表
  • key : 字面量"abc"中的驻留字符 abc
  • value:
    • 若该 key 在池中有对象,则 value 为池中对象的物理地址
    • 若该 key 的 value 是堆中对象的地址引用

str.intern()方法

  • 若池中有,则返回池中的地址,若无,则说明 str 是堆中对象,将 (str :str 的堆中地址)加入 StringTable 后,返回池中地址。
  • Java 常量池:静态常量池 动态常量池 字符串池_第5张图片

 

 

 

 

你可能感兴趣的:(java,jvm,开发语言)