运行时常量池

运行时常量池是方法区的一部分

Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,
用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。

Java虚拟机对于Class文件每一部分(包括常量池)的格式都有严格规定,如每一个字节用于存储哪种数据都必须符合规范上的要求,才会被虚拟机认可、加载和执行。
但是对于运行时常量池,规范中并没有做任何细节要求,
不同提供商实现的虚拟机可以按自己需求实现这个内存区域。
一般来说,除了保存Class文件中描述的符号引用外,还会把由符号引用翻译出来的直接引用也存储在运行时常量池中。

运行时常量池相对于Class文件常量池的另外一个重要特征是具备动态性
Java语言并不要求常量一定只有编译期才能产生
也就是说,并非预置入Class文件中常量池内容才能进入方法区运行时常量池,
运行期间也可以将新的常量防入池中。
这种特性被开发人员利用较多的是String类的intern()方法

运行时常量池是方法区的一部分,所以也受到方法区的限制
当常量池无法再申请到内存时会抛出OutOfMemoryError异常

posted @ 2021-01-31 16:11  张三丰学Java  阅读(361)  评论(0编辑  收藏  举报