一、概述

  • 方法区,内部包含了运行时常量池;
  • 字节码文件,内部包含了常量池;
  • 要弄清楚方法区,需要理解清楚ClassFile,因为加载类的信息都在方法区;
  • 要弄清楚方法区的运行时常量池,需要理解清楚Class File文件中的常量池;

java运行时常量池存放什么 jvm 常量池和运行时常量池_方法区

java运行时常量池存放什么 jvm 常量池和运行时常量池_java运行时常量池存放什么_02

java运行时常量池存放什么 jvm 常量池和运行时常量池_jvm_03

一个有效的字节码文件中除了包含类的版本信息、字段、方法以及接口等描述信息外,还包含一项信息,那就是常量池表(Constant Pool Table),包括各种字面量和对类型、域和方法的符号引用。

二、为什么需要常量池?

java运行时常量池存放什么 jvm 常量池和运行时常量池_字面量_04

三、运行时常量池

  • 运行时常量池(Runtime Constant Pool)是方法区的一部分;
  • 常量池表(Constant Pool Table)是Class文件的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后,存放到方法区的运行时常量池中。
  • 运行时常量池,在加载类和接口到虚拟机后,就会创建对应的运行时常量池。
  • JVM为每个已加载的类型(类或接口)都维护一个常量池。池中的数据项像数组的数据项一样,是通过索引访问的。
  • 运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能获得的方法或者字段引用。此时不再是常量池中的符号地址了,这里换为真实地址。运行时常量池,相对于Class文件常量池的另一个重要特征:具备动态性。
  • 运行时常量池类似于传统语言中的符号表(symbol table),但是,它包含的数据比符号表要丰富一些。
  • 当创建类或者接口的运行时常量池时,如果构造运行时常量池所需的内存空间超过了方法区所能提供的最大值,则JVM会抛OutOfMemoryError异常。