精华内容
下载资源
问答
  • 简介: 这几天在看Java虚拟机方面的知识,看到了有几种不同常量池的说法,然后我就去CSDN、博客园等...字符串常量池(String Constant Pool):1.1:字符串常量池Java内存区域的哪个位置? 在JDK6.0及之前版本,字符串

    简介:

    这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN、博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨:

    在Java的内存分配中,总共3种常量池:

    1.字符串常量池(String Constant Pool):

    1.1:字符串常量池在Java内存区域的哪个位置?

    • 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;
    • 在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。

    1.2:字符串常量池是什么?

    • 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上。
    • 在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String#intern()时会需要到链表上一个一个找,从而导致性能大幅度下降;
    • 在JDK7.0中,StringTable的长度可以通过参数指定:
    -XX:StringTableSize=66666

    1.3:字符串常量池里放的是什么?

    • 在JDK6.0及之前版本中,String Pool里放的都是字符串常量;
    • 在JDK7.0中,由于String#intern()发生了改变,因此String Pool中也可以存放放于堆内的字符串对象的引用。关于String在内存中的存储和String#intern()方法的说明,可以参考我的另外一篇博客:

    需要说明的是:字符串常量池中的字符串只存在一份!
    如:

    String s1 = "hello,world!";
    String s2 = "hello,world!";

    即执行完第一行代码后,常量池中已存在 “hello,world!”,那么 s2不会在常量池中申请新的空间,而是直接把已存在的字符串内存地址返回给s2。(这里具体的字符串如何分配就不细说了,可以看我的另一篇博客)

    2.class常量池(Class Constant Pool):

    2.1:class常量池简介:

    • 我们写的每一个Java类被编译后,就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References);
    • 每个class文件都有一个class常量池。

    2.2:什么是字面量和符号引用:

    • 字面量包括:1.文本字符串 2.八种基本类型的值 3.被声明为final的常量等;
    • 符号引用包括:1.类和方法的全限定名 2.字段的名称和描述符 3.方法的名称和描述符。

    3.运行时常量池(Runtime Constant Pool):

    • 运行时常量池存在于内存中,也就是class常量池被加载到内存之后的版本,不同之处是:它的字面量可以动态的添加(String#intern()),符号引用可以被解析为直接引用
    • JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。
    展开全文
  • 前言 本文主要用于记录和分享一下博主在解决如题问题,从各种途径所查询到的个人认为比较可信的相关资料,以及他人或个人得出的一些结论。...顾名思义,即用于存放字符串常量运行时内存结构,其底层实现为一种

    前言

    • 本文主要用于记录和分享一下博主在解决如题问题时,从各种途径所查询到的个人认为比较可信的相关资料,以及他人或个人得出的一些结论。如果参考资料或者所得结论存在错误,欢迎批评指正。
    • 注意:本文中提及到的概念,均建立在使用HotSpot VM的基础上,在其他Java虚拟机中并不一定适用。

    Q&A

    Q1:什么是字符串常量池

    字符串常量池,即String Constant Pool,又叫做String PoolString Table。顾名思义,即用于存放字符串常量的运行时内存结构,其底层实现为一种Hashtable。其中所指的字符串常量,可以是编译期在源码中显式的字符串字面量,也可以是之后在程序运行时创建的字符串String对象。

    JDK1.6及之前,字符串常量池中只会存放具体的String实例,在使用String.intern方法时,若字符串常量池中有满足String.equals方法的String对象,则返回其引用;若字符串常量池中没有相同的String对象,则当前String对象为堆上对象,故在字符串常量池中创建一个相同的String对象,并返回其引用。

    JDK1.7及之后,字符串常量池中不仅可以存放String实例,同时还能存放指向Java堆中某个String实例的引用。在使用String.intern方法时,若字符串常量池中有满足String.equals方法的String对象,则返回其引用,这一点和JDK1.6相同;若字符串常量池中没有相同的String对象,则当前String对象为堆上对象,故在字符串常量池中存放一个指向堆上此String对象的引用,并返回此引用。

    参考资料

    • stackoverflow: String Constant Pool vs String pool

    • stackoverflow: String pool vs Constant pool

    • 美团技术团队: 深入解析String#intern

    • 在IDK1.6中,intern() 方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用。而JDK1.7中(以及部分其他虚拟机,例如 JRockit)的 intern() 实现不会再复制实例,只是在常量池中记录首次出现的实例引用。
      ——《深入理解 Java 虚拟机(第2版)》2.4.3 方法区和运行时常量池溢出

    • JDK 7(以及部分其他虚拟机,例如 JRockit)的 intern() 方法实现就不需要再拷贝字符串的实例到永久代了,既然字符串常量池已经移到 Java 堆中,那只需要在常量池里记录一下首次出现的实例引用即可。
      ——《深入理解 Java 虚拟机(第3版)》2.4.3 方法区和运行时常量池溢出

    • 在方法区中常量引用的对象,譬如字符串常量池(String Table)里的引用
      ——《深入理解 Java 虚拟机(第3版)》3.2.2 可达性分析


    Q2:字符串常量池在JVM中的分布

    JDK1.6及之前,字符串常量和其他的基本类型的常量一样,存放在 运行时常量池(Run-Time Constant Pool) 中,即在方法区(HotSpot中为永久代PermGen)中。

    JDK1.7及之后,字符串常量的存放位置已经从运行时常量池中分离到了 Java堆(Heap) 中,形成了独立的字符串常量池(String Pool),其中一方面也是因为在永久代中创建String对象,容易耗尽永久代内存空间。

    参考资料

    • 美团技术团队: 深入解析String#intern
    • 在IDK1.6中,intern() 方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符串实例的引用。而JDK1.7中(以及部分其他虚拟机,例如 JRockit)的 intern() 实现不会再复制实例,只是在常量池中记录首次出现的实例引用。
      ——《深入理解 Java 虚拟机(第2版)》2.4.3 方法区和运行时常量池溢出
    • JDK 7(以及部分其他虚拟机,例如 JRockit)的 intern() 方法实现就不需要再拷贝字符串的实例到永久代了,既然字符串常量池已经移到 Java 堆中,那只需要在常量池里记录一下首次出现的实例引用即可。
      ——《深入理解 Java 虚拟机(第3版)》2.4.3 方法区和运行时常量池溢出

    Q3:字符串字面量在class文件中的位置

    源码经过Java编译器编译后,其中的字符串字面量以CONSTANT_String_info的形式存放在class文件的常量池(Constant Pool) 中。class文件的常量池,可以通过javac -verbose命令显式查看。

    示例代码(JDK1.8)

    package cn.tomandersen.javastudy.LeetCode;
    
    public class Test {
        public static String s1 = "He";
        public String s2 = "llo";
    
        public static void main(String[] args) {
            System.out.println("Hello");
        }
    }
    

    javac -verbose编译结果

    Constant pool:
       #1 = Methodref          #10.#28        // java/lang/Object."<init>":()V
       #2 = String             #29            // llo
       #3 = Fieldref           #9.#30         // cn/tomandersen/javastudy/LeetCode/Test.s2:Ljava/lang/String;
       #4 = Fieldref           #31.#32        // java/lang/System.out:Ljava/io/PrintStream;
       #5 = String             #33            // Hello
       #6 = Methodref          #34.#35        // java/io/PrintStream.println:(Ljava/lang/String;)V
       #7 = String             #36            // He
       #8 = Fieldref           #9.#37         // cn/tomandersen/javastudy/LeetCode/Test.s1:Ljava/lang/String;
       #9 = Class              #38            // cn/tomandersen/javastudy/LeetCode/Test
      #10 = Class              #39            // java/lang/Object
      #11 = Utf8               s1
      #12 = Utf8               Ljava/lang/String;
      #13 = Utf8               s2
      #14 = Utf8               <init>
      #15 = Utf8               ()V
      #16 = Utf8               Code
      #17 = Utf8               LineNumberTable
      #18 = Utf8               LocalVariableTable
      #19 = Utf8               this
      #20 = Utf8               Lcn/tomandersen/javastudy/LeetCode/Test;
      #21 = Utf8               main
      #22 = Utf8               ([Ljava/lang/String;)V
      #23 = Utf8               args
      #24 = Utf8               [Ljava/lang/String;
      #25 = Utf8               <clinit>
      #26 = Utf8               SourceFile
      #27 = Utf8               Test.java
      #28 = NameAndType        #14:#15        // "<init>":()V
      #29 = Utf8               llo
      #30 = NameAndType        #13:#12        // s2:Ljava/lang/String;
      #31 = Class              #40            // java/lang/System
      #32 = NameAndType        #41:#42        // out:Ljava/io/PrintStream;
      #33 = Utf8               Hello
      #34 = Class              #43            // java/io/PrintStream
      #35 = NameAndType        #44:#45        // println:(Ljava/lang/String;)V
      #36 = Utf8               He
      #37 = NameAndType        #11:#12        // s1:Ljava/lang/String;
      #38 = Utf8               cn/tomandersen/javastudy/LeetCode/Test
      #39 = Utf8               java/lang/Object
      #40 = Utf8               java/lang/System
      #41 = Utf8               out
      #42 = Utf8               Ljava/io/PrintStream;
      #43 = Utf8               java/io/PrintStream
      #44 = Utf8               println
      #45 = Utf8               (Ljava/lang/String;)V
    

    从javac工具的编译结果来看,可以发现class文件的常量池(Constant Pool)中保存有源码中出现的所有字符串字面量。

    参考资料

    • 常量池中主要存放两大类常量:字面量(Literal)和符号引用(Symbolic References)。字面量比
      较接近于Java语言层面的常量概念,如文本字符串、被声明为final的常量值等。

      ——《深入理解 Java 虚拟机(第3版)》6.3.2 常量池

    Q4:字符串字面量何时进入到字符串常量池中

    字符串字面量,和其他基本类型的字面量或常量不同,并不会在类加载中的解析(resolve) 阶段填充并驻留在字符串常量池中,而是以特殊的形式存储在 运行时常量池(Run-Time Constant Pool) 中。而是只有当此字符串字面量被调用时(如对其执行ldc字节码指令,将其添加到栈顶),HotSpot VM才会对其进行resolve,为其在字符串常量池中创建对应的String实例。

    JDK1.7的HotSpot VM中,这种还未真正解析(resolve)的String字面量,以JVM_CONSTANT_UnresolvedString的形式存放在运行时常量池中,此时并未为其创建String实例;

    JDK1.8的HotSpot VM中,这种未真正解析(resolve)的String字面量,被称为pseudo-string,以JVM_CONSTANT_String的形式存放在运行时常量池中,此时并未为其创建String实例。

    编译期,字符串字面量以"CONSTANT_String_info"+"CONSTANT_Utf8_info"的形式存放在class文件的 常量池(Constant Pool) 中;

    类加载之后,字符串字面量以"JVM_CONSTANT_UnresolvedString(JDK1.7)"或者"JVM_CONSTANT_String(JDK1.8)"的形式存放在 运行时常量池(Run-time Constant Pool) 中;

    首次使用某个字符串字面量时,字符串字面量以真正的String对象的方式存放在 字符串常量池(String Pool) 中。

    示例代码(JDK1.8)

    package cn.tomandersen.javastudy.LeetCode;
    
    public class Test {
        public static void main(String[] args) {
            String s1 = new String("He") + new String("llo");// 堆上创建"Hello","He","llo"实例,String Pool中创建"He"和"llo"实例
            s1.intern();// 将堆上"Hello"的引用存入String Pool
            String s2 = "Hello";// 获取String Pool中的"Hello"的引用
            System.out.println(s1 == s2);// true
        }
    }
    

    参考资料

    知乎: Java 中new String(“字面量”) 中 “字面量” 是何时进入字符串常量池的?

    OpenJDK1.7 HotSpot: src/share/vm/oops/constantPoolOop.cpp

    OpenJDK1.8 HotSpot: src/share/vm/oops/constantPool.cpp


    Q5:new String("Hello");到底创建了几个对象

    基于对之前问题的解答,这个问题就比较好解答了:

    • 若此代码运行之前没有显示使用过"Hello"字面量,也没有调用某个值为"Hello"字符串对象的intern方法,那么new String("Hello")运行时会创建两个对象,一个在上,一个在字符串常量池

    • 若此代码运行之前已经使用过"Hello"字面量,或者调用了intern方法,在字符串常量池中创建了相同的实例或者保存了堆上相同对象的引用,那么new String("Hello")运行时只会创建一个对象,在

    注意

    若在某个类的静态变量中使用了某个字符串字面量,如"Hello",则在类加载的初始化(initialize)阶段,便会在字符串常量池中创建对应的String实例,并将其赋值给对应的静态变量

    示例代码(JDK1.8)

    package cn.tomandersen.javastudy.LeetCode;
    
    public class Test {
        public static String s = "Hello";
        
        public static void main(String[] args) {
            String s1 = new String("He") + new String("llo");
            // 堆上创建"Hello","He","llo"实例,String Pool中创建"He"和"llo"实例
            s1.intern();
            // String Pool中已有"Hello",故没有将s1的引用添加到String Pool中,返回的是String Pool中已有的"Hello"的引用
            String s2 = "Hello";
            // 获取String Pool中的"Hello"的引用
            System.out.println(s1 == s2);// false
            System.out.println(s == s2);// true
        }
    }
    

    End~

    展开全文
  • 在JDK1.7 字符串常量池被从方法区拿到了堆, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot的永久代 在JDK1.8 hotspot移除了永久代用元空间(Me....

    在Java的内存分配中,总共3种常量池:

    JDK1.7之前运行时常量池逻辑包含字符串常量池存放在方法区, 此时hotspot虚拟机对方法区的实现为永久代

    JDK1.7 字符串常量池被从方法区拿到了堆中, 这里没有提到运行时常量池,也就是说字符串常量池被单独拿到堆,运行时常量池剩下的东西还在方法区, 也就是hotspot中的永久代

    JDK1.8 hotspot移除了永久代用元空间(Metaspace)取而代之, 这时候字符串常量池还在堆, 运行时常量池还在方法区, 只不过方法区的实现从永久代变成了元空间(Metaspace) 
     

    一.字符串常量池(String Constant Pool):

    字符串常量池在Java内存区域的哪个位置?

    在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;
    在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了.

    字符串常量池是什么?

    • 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上。
    • 在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String#intern()时会需要到链表上一个一个找,从而导致性能大幅度下降;
    • 在JDK7.0中,StringTable的长度可以通过参数指定:
       

    -XX:StringTableSize=66666 

    1.3:字符串常量池里放的是什么?

    • 在JDK6.0及之前版本中,String Pool里放的都是字符串常量;
    • 在JDK7.0中,由于String#intern()发生了改变,因此String Pool中也可以存放放于堆内的字符串对象的引用。

    二.class常量池(Class Constant Pool静态常量池):

    2.1:class常量池简介:

    我们写的每一个Java类被编译后,就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References);
    每个class文件都有一个class常量池。

    2.2:什么是字面量和符号引用:

    • 字面量包括:1.文本字符串 2.八种基本类型的值 3.被声明为final的常量等;
    • 符号引用包括:1.类和方法的全限定名 2.字段的名称和描述符 3.方法的名称和描述符。

    三.运行时常量池(Runtime Constant Pool):

    • 运行时常量池存在于内存中,也就是class常量池被加载到内存之后的版本,不同之处是:它的字面量可以动态的添加(String#intern()),符号引用可以被解析为直接引用
    • JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。
       

    总结

     

    • 1.字符串常量池在每个虚拟机中只有一份,存放的是字符串常量的引用值。(堆)
    • 2.class常量池是在编译的时候每个class都有的,在编译阶段,存放的是常量的符号引用。(方法区)
    • 3.运行时常量池是在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中,也就是说,每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致。(方法区)
    • 方法区里存储着class文件的信息和运行时常量池,class文件的信息包括类信息和class文件常量池。

     

    è¿éåå¾çæè¿° 

    展开全文
  • 简介: 这几天在看Java虚拟机方面的知识,看到了有几...1.1:字符串常量池Java内存区域的哪个位置? 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区); 在JDK7.0版本,字符串常量池被移到了堆

    简介:

    这几天在看Java虚拟机方面的知识时,看到了有几种不同常量池的说法,然后我就去CSDN、博客园等上找资料,里面说的内容真是百花齐放,各自争艳,因此,我好好整理了一下,将我自认为对的理解写下来与大家共同探讨:

    在Java的内存分配中,总共3种常量池:

    1.字符串常量池(String Constant Pool):

    1.1:字符串常量池在Java内存区域的哪个位置?

    • 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区)中;
    • 在JDK7.0版本,字符串常量池被移到了堆中了。至于为什么移到堆内,大概是由于方法区的内存空间太小了。

    1.2:字符串常量池是什么?

    • 在HotSpot VM里实现的string pool功能的是一个StringTable类,它是一个Hash表,默认值大小长度是1009;这个StringTable在每个HotSpot VM的实例只有一份,被所有的类共享。字符串常量由一个一个字符组成,放在了StringTable上。
    • 在JDK6.0中,StringTable的长度是固定的,长度就是1009,因此如果放入String Pool中的String非常多,就会造成hash冲突,导致链表过长,当调用String#intern()时会需要到链表上一个一个找,从而导致性能大幅度下降;
    • 在JDK7.0中,StringTable的长度可以通过参数指定:
    -XX:StringTableSize=66666
    • 1

    1.3:字符串常量池里放的是什么?

    • 在JDK6.0及之前版本中,String Pool里放的都是字符串常量;
    • 在JDK7.0中,由于String#intern()发生了改变,因此String Pool中也可以存放放于堆内的字符串对象的引用。关于String在内存中的存储和String#intern()方法的说明,可以参考我的另外一篇博客:

    需要说明的是:字符串常量池中的字符串只存在一份!
    如:

    String s1 = "hello,world!";
    String s2 = "hello,world!";
    • 1
    • 2

    即执行完第一行代码后,常量池中已存在 “hello,world!”,那么 s2不会在常量池中申请新的空间,而是直接把已存在的字符串内存地址返回给s2。(这里具体的字符串如何分配就不细说了,可以看我的另一篇博客)

    2.class常量池(Class Constant Pool):

    2.1:class常量池简介:

    • 我们写的每一个Java类被编译后,就会形成一份class文件;class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References);
    • 每个class文件都有一个class常量池。

    2.2:什么是字面量和符号引用:

    • 字面量包括:1.文本字符串 2.八种基本类型的值 3.被声明为final的常量等;
    • 符号引用包括:1.类和方法的全限定名 2.字段的名称和描述符 3.方法的名称和描述符。

    3.运行时常量池(Runtime Constant Pool):

    • 运行时常量池存在于内存中,也就是class常量池被加载到内存之后的版本,不同之处是:它的字面量可以动态的添加(String#intern()),符号引用可以被解析为直接引用
    • JVM在执行某个类的时候,必须经过加载、连接、初始化,而连接又包括验证、准备、解析三个阶段。而当类加载到内存中后,jvm就会将class常量池中的内容存放到运行时常量池中,由此可知,运行时常量池也是每个类都有一个。在解析阶段,会把符号引用替换为直接引用,解析的过程会去查询字符串常量池,也就是我们上面所说的StringTable,以保证运行时常量池所引用的字符串与字符串常量池中是一致的。

    本文转载于:https://blog.csdn.net/zm13007310400/article/details/77534349

    展开全文
  • class常量池字符串常量池运行时常量池的区别

    千次阅读 多人点赞 2020-04-03 20:42:03
    文章目录一、概念1、Class 常量池(Class Constant Pool)1.1、常量池中数据项类型2、字符串池(String Pool、String Literal Pool)2.1、参考文章:3、运行时常量池(Runtime Constant Pool)4、总结二、方法区的...
  • 在之前在看jvm虚拟机的书,结果看到常量池的时候,看得一脸懵逼,去网上查也是云里雾里.所以这里自己花几天摸清楚...jdk1.7后intern方法将字符串放到常量池,到底是在堆创建对象,然后放的堆的对象的引用,还是在直接...
  • JDK1.8API文档描述: //案例1: // String str2 = "abcabc";... /* 字面量"abc",在字符串常量池中没有"abc"对象,就在字符串常量池中创建"abc"对象, * 同时在堆new一个"abc"对象,str2指向堆的那个对象
  • java的内存分配,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分一下这几个...
  • java的内存分配,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着来区分...
  • welcome to my blog 根据《深入理解Java虚拟机》和网上搜索的资料总结一下这三个的区别 ...常量池中主要存放两大类常量: 字面量(Literal)和符号引用(Symbolic References) 字面量比较接近于Java语言...
  • 写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的...常量池与Class常量池 2.运.
  • 常量池 是.class文件的常量池,也可以理解为一张表,虚拟机指令根据这张常量表找到要执行的类名,方法名,参数类型,字面量等信息 ...而运行时常量池是在方法区,而且可在JVM运行期间动态向运行时常量池中写入...
  • 1、常量 常量在java中就值的是一般的字面量,比如字符串,整数,浮点数等等数据。简单理解java中什么叫常量 2、常量池,也叫静态常量池,说常量池一定要指明是编译器生产
  • 在JDK7之前,字符串常量是存在永久带Perm 区的,JDK7开始在将常量池迁移到堆,这个变化也导致了String的新特性,接下来,我们按照jdk1.7开始后的版本进行介绍。 JdK1.7之前 Jdk1.7开始 一.常量池共有三...
  • 【番外篇】本篇核心:JDK各个版本JDK的运行时常量池字符串常量池、静态常量池的功能及存储位置。 在写本系列文章,发现一旦追究起底层实现都会涉及到一些内存结构的问题。其中涉及比较多的便是常量池,本篇...
  • JDK1.8关于运行时常量池, 字符串常量池的要点

    万次阅读 多人点赞 2018-11-29 22:53:13
    网上关于jdk 1.8的各种实验, 结论鱼龙混杂 , 很多都相矛盾,网上有的实验也被后人测试出了不同的结果 很多都分辨不了真假, 这里记录一下网络上正确的结论, ...在JDK1.7之前运行时常量池逻辑包含字符串常量池存放在...
  • 字符串常量池(String Poll) java6: 存在于永久代中。 字符串常量池保存的是字符串常量。 java7: 转移到了堆字符串常量池存的是字符串常量和堆内的字符串对象的引用。 静态常量池(class文件常量池) ...
  • 1.1:字符串常量池Java内存区域的哪个位置? 在JDK6.0及之前版本,字符串常量池是放在Perm Gen区(也就是方法区); 在JDK7.0版本,字符串常量池被移到了堆了。至于为什么移到堆内,大概是由于方法区的内存空间...
  • 常量池 诞生时间:编译 所处区域:堆(类常量池存在Class文件,一个Class文件对应一个...所处区域:本地内存(每个class都有一个运行时常量池运行时常量池存在元空间) 储存内容:class文件元信息描述,编...
  • 存储内容 clss文件除了有类的版本方法 , 字段 , 接口等描述信息外 , 还有一项信息是常量池 , 用于存放编译期生成的各种字面量喝符号引用 , 这部分内容在类加载后进入方法区的运行时常量池中存放。 字面量 : 双...
  • 文章目录运行时常量池字符串常量池存储内容存储位置常量池区别字符串常量池如何存储数据字符串常量池简介字符串常量池案例分析案例分析一分析二分析三分析四分析五分析六分析七String的Intern方法详解intern的作用...
  • 字符串常量池、class常量池运行时常量池

    万次阅读 多人点赞 2017-06-12 20:09:36
    java的内存分配,经常听到很多关于常量池的描述,我开始看的时候也是看的很模糊,网上五花八门的说法简直太多了,最后查阅各种资料,终于算是差不多理清了,很多网上说法都有问题,笔者尝试着...
  • 4)字符串常量池运行时常量池究竟去了哪里?4)元空间是什么?5)关于为什么移除永久代?5)补充         我们知道在JDK1.8取消了永久代,区而代之使用了元空间来实现...
  • 文章目录引入:方法区常量池概述字符串常量池class常量池运行时常量池 这里介绍 字符串常量池、class常量池运行时常量池 这三个常量池的概念。 引入:方法区常量池概述 方法区包含运行时常量池、自动和方法数据...
  • 常量池表(Constant Pool Table)是Class文件(字节码文件)的一部分,在编译阶段,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中运行时常量池就是常量池在程序...
  • 常量池中字面量(数量值、字符串值)和符号引用(类符号引用、字段符号引用、方法符号引用),虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型 运行时常量池 每个class一份,存在于方法区...
  • Java中常量池分为三种类型: 类文件中常量池(The Constant Pool) 运行时常量池(The Run-Time Constant Pool) String常量池   类文件中常量池 ---- 存在于Class文件 所处区域:堆 诞生时间:编译 ...
  • 主要介绍了Java中字符串常量池详细介绍,JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池,需要的朋友可以参考下
  • 一、字符串常量池(String Pool)——位于方法区 1.结构: ...(关于字符串常量池中存的到底是对象实例还是对象实例的引用,网上有各种说法,大家可以自行百度一下。) 2.特点: A、这个Strin...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,455
精华内容 8,182
关键字:

java运行时常量池字面量中的字符串

java 订阅