Java千百问_07JVM架构(019)_运行时常量池是什么
2016-06-09 07:43
489 查看
点击进入_更多_Java千百问
了解java内存管理看这里:jvm是如何管理内存的
如图:
运行时常量是相对于常量来说的,它具备一个重要特征是:动态性。当然,值相同的动态常量与我们通常说的常量只是来源不同,但是都是储存在池内同一块内存区域。
Java语言并不要求常量一定只能在编译期产生,运行期间也可能产生新的常量,这些常量被放在运行时常量池中。这里所说的常量包括:基本类型包装类(包装类不管理浮点型,整形只会管理-128到127)和String(也可以通过String.intern()方法可以强制将String放入常量池)。
了解基本类型包装器看这里:什么是基本类型包装器
例子:
运行结果:
true
true
true
true
false
false
Java虚拟机对Class文件的每一部分的格式都有严格的规定,每一个字节用于存储哪种数据都必须符合规范,这样才会被虚拟机装载和执行。但对于运行时常量池,Java虚拟机规范没有做任何细节的要求,不同的提供商实现的虚拟机可以按照自己的需要来实现这个内存区域。
由于运行时常量池是方法区的一部分,所以会受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError: PermGen space异常。
在Java 8以后移除了方法区,由本地元空间代替,运行时常量池也放在了本地元空间中,如果这个区内存溢出,则会抛出OutOfMemoryError: Metaspace错误。
1、运行时常量池是什么
运行时常量池(Runtime Constant Pool),它是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后存放到常量池中。了解java内存管理看这里:jvm是如何管理内存的
如图:
运行时常量是相对于常量来说的,它具备一个重要特征是:动态性。当然,值相同的动态常量与我们通常说的常量只是来源不同,但是都是储存在池内同一块内存区域。
Java语言并不要求常量一定只能在编译期产生,运行期间也可能产生新的常量,这些常量被放在运行时常量池中。这里所说的常量包括:基本类型包装类(包装类不管理浮点型,整形只会管理-128到127)和String(也可以通过String.intern()方法可以强制将String放入常量池)。
了解基本类型包装器看这里:什么是基本类型包装器
例子:
public class TestConst { public static String CONST_A = "the const b";// 编译时放入常量池 public String const_b; public Integer const_b_i; public Integer const_b_ii; public Float const_b_f; public static void main(String[] args) { TestConst testConst = new TestConst(); testConst.const_b = "the const b";// 运行时放入常量池 testConst.const_b_i = 12;// 运行时放入常量池 testConst.const_b_ii = 128;// 超过127,所以不会放入常量池 testConst.const_b_f = 2.0f;// 浮点包装器不放入常量池 String const_c = "the const b";// 运行时放入常量池 Integer const_c_i = 12;// 运行时放入常量池 Integer const_c_ii = 128;// 超过127,所以不会放入常量池 Float const_c_f = 2.0f;// 浮点包装器不放入常量池 System.out.println(CONST_A == const_c); System.out.println(CONST_A == testConst.const_b); System.out.println(testConst.const_b == const_c); System.out.println(testConst.const_b_i == const_c_i); System.out.println(testConst.const_b_ii == const_c_ii); System.out.println(testConst.const_b_f == const_c_f); } }
运行结果:
true
true
true
true
false
false
Java虚拟机对Class文件的每一部分的格式都有严格的规定,每一个字节用于存储哪种数据都必须符合规范,这样才会被虚拟机装载和执行。但对于运行时常量池,Java虚拟机规范没有做任何细节的要求,不同的提供商实现的虚拟机可以按照自己的需要来实现这个内存区域。
由于运行时常量池是方法区的一部分,所以会受到方法区内存的限制,当常量池无法再申请到内存时会抛出OutOfMemoryError: PermGen space异常。
在Java 8以后移除了方法区,由本地元空间代替,运行时常量池也放在了本地元空间中,如果这个区内存溢出,则会抛出OutOfMemoryError: Metaspace错误。
相关文章推荐
- 【连载】大话系统架构决策 - 易用性
- Google浏览器的缓存文件过大(mega网站导致的)
- 粗浅看 Web基础架构:负载均衡和LVS
- 微网站活动中的项目优化总结
- 云原生应用程序架构的五大特性(上)- 12要素应用
- Spark Streaming揭秘 Day22 架构源码图解
- 人人都是架构师
- 架构(Architecture)和框架(Framework)杂谈
- HBase 系统架构
- 大型网站系统架构的演化
- Skia深入分析2——skia渲染架构
- 架构揭秘
- WampSever 3 修改网站根目录
- MFS+Keepalived双机高可用热备方案操作记录
- [转]大型网站架构系列:电商网站架构案例(3)
- [转]大型网站架构系列:电商网站架构案例(2)
- [转]大型网站架构系列:电商网站架构案例(1)
- [转]大型分布式网站架构技术总结
- Mysql双主热备+LVS+Keepalived高可用操作记录
- 2016全球排名前50的博客网站性能