运行时常量池(Runtime Constant Pool)
它是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述等信息
外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和
符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
Java 虚拟机对 Class 文件的每一部分(自然也包括常量池)的格式都有严格的规定,每一个
字节用于存储哪种数据都必须符合规范上的要求,这样才会被虚拟机认可、装载和执行。但对于运
行时常量池,Java 虚拟机规范没有做任何细节的要求,不同的提供商实现的虚拟机可以按照
自己的需要来实现这个内存区域。不过,一般来说,除了保存 Class 文件中描述的符号引用
外,还会把翻译出来的直接引用也存储在运行时常量池中。
运行时常量池相对于 Class 文件常量池的另外一个重要特征是具备动态性,Java 语言并
不要求常量一定只能在编译期产生,也就是并非预置入 Class 文件中常量池的内容才能进
入方法区运行时常量池,运行期间也可能将新的常量放入池中,这种特性被开发人员利用
得比较多的便是 String 类的 intern(方) 法。
既然运行时常量池是方法区的一部分,自然会受到方法区内存的限制,当常量池无法再
申请到内存时会抛出 OutOfMemoryError 异常。