JVM架构(019)_运行时常量池是什么

转载 2016年08月30日 16:38:38

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错误。



Java千百问_07JVM架构(019)_运行时常量池是什么

点击进入_更多_Java千百问1、运行时常量池是什么运行时常量池(Runtime Constant Pool),它是方法区的一部分。Class文件中除了有类的版本、字段、方法、接口等描述等信息外,还有...
  • ooppookid
  • ooppookid
  • 2016年06月09日 07:43
  • 2847

Java中的栈,堆,方法区和常量池

1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(对...
  • fuckluy
  • fuckluy
  • 2016年01月31日 16:32
  • 7317

Java虚拟机-----方法区和运行时常量池

方法区: 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据(是唯一的数据)。当java虚拟机通...
  • sunshine__me
  • sunshine__me
  • 2015年11月23日 11:37
  • 5406

jvm虚拟机运行时内存分析,堆,栈,方法区,程序计数器,本地栈,常量池

**JVM自动内存管理机制** java内存区域与内存溢出异常 概述 : 对于从事C/C++程序开发的开发人员来说,在内存管理领域他们是拥有最高权力的皇帝又是从事最基础工作的劳动人民,即拥有每一...
  • m0_37034294
  • m0_37034294
  • 2017年12月19日 17:18
  • 115

JVM 内存基础概念之 方法区和运行时常量池

方法区和运行时常量池 方法区 方法区和 Java 堆一样,是被所有线程所共享的一块内存区域。 方法区的作用是存储已经被 JVM 加载到方法区之中的 Java 类的类型信息。 前面我们多次提到了类的实...
  • Airsaid
  • Airsaid
  • 2016年02月23日 16:28
  • 2028

JVM运行时数据区介绍[堆、栈、方法区、常量池]

程序计数器:当前线程所执行的字节码的行号指示器。 栈: 栈内存、虚拟机栈、或者说是虚拟机栈中的局部变量表。 用于存放编译期可知的各种 基本数据类型、对象引用类型[ 她可能是一个引用指针、也...
  • wang_situ
  • wang_situ
  • 2014年08月14日 16:32
  • 969

JVM学习06:运行时数据区域-运行时常量池

基本描述 运行时常量池是方法区的一部分,Class文件除了类信息、字段信息、方法信息、接口信息外还有一项信息是常量池(Constant Pool Table),用于存放编译期生成的各种字面量和符号引用...
  • sld880311
  • sld880311
  • 2017年06月05日 09:02
  • 141

JVM-String常量池与运行时常量池

Start with JVM 先分析一波常量池-Constant Pool
  • Sugar_Rainbow
  • Sugar_Rainbow
  • 2017年03月29日 21:44
  • 3678

JVM-由常量池 运行时常量池 String intern方法想到的(三)之String内存模型

由常量池 运行时常量池 String intern方法想到的(三)之String内存模型 在这篇博文中描述的,所有在运行时常量池中出现的字符串其实都是一个String对象。因为,java是一种强类型的...
  • ApatheCrazyFan
  • ApatheCrazyFan
  • 2016年12月26日 19:58
  • 887

Java虚拟机-----方法区和运行时常量池

方法区: 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的 代码等数据(是唯一的数据)。当java...
  • wushiwude
  • wushiwude
  • 2017年04月12日 11:01
  • 417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JVM架构(019)_运行时常量池是什么
举报原因:
原因补充:

(最多只允许输入30个字)