jvm 字符串池与常量池

nzk0hqpo  于 2023-02-04  发布在  其他
关注(0)|答案(3)|浏览(93)

让我们看看下面的代码片段:

String s1 = "Hello";
  String s2 = "Hello";

两个变量引用同一个对象,因为字符串是不可变的,所以只创建一个对象,并且两个变量引用同一个对象。
一个constant pool也是一个东西,它保存了类中声明的所有常量(整型、字符串等),它是特定于每个类的。

System.out.println("Hello");  // I believe this Hello is different from above.
    • 问题:**
  1. string pool是否引用常量池中常量字符串对象的池?
    1.如果是,* 字符串池 * 是整个应用程序中的公共池,还是特定于某个类?
bcs8qyzn

bcs8qyzn1#

我的问题是,
1.字符串池是指常量池中常量字符串对象的池吗?
没有。
“常量池”是指类文件中对Java类加载器有意义的特殊格式的字节集合,其中的“字符串”是serialized,它们不是Java对象,常量的种类也很多,而不仅仅是字符串。
见第4.4章常量池表
Java虚拟机指令不依赖于类、接口、类示例或数组的运行时布局,而是引用constant_pool表中的符号信息。
相反,“字符串池”是在运行时使用的(而不仅仅是在类加载期间),只包含字符串,字符串池中的“字符串”是java对象,“字符串池”是从java.lang.String示例到java.lang.String示例的线程安全弱Map,用于实习字符串。
第3.10.5章字符串字面量表示
字符串字面量是对类String的示例的引用(参见4.3.1节)。
此外,字符串常量总是引用类String的同一个示例,这是因为字符串常量--或者更一般地说,常量表达式的值(参见15.28节)--是被“interned”的,以便共享唯一的示例,使用的是String.intern方法。

rks48beu

rks48beu2#

只有一个字符串池,并且所有字符串字面值都被自动暂存。
此外,还有其他用于自动装箱等的池。
常量池是为类放置这些文本的地方。

euoag5mw

euoag5mw3#

constans_pool(所有constans,包括String)是类文件中的一个数据结构(在JVM之外),当类文件加载到JVM中时,constans_pool-〉run-time constans_pool(General),在hotspot & SE8:

  1. constans_pool中的字符串将存储在Heap中,我们称之为string-pool;https://openjdk.org/jeps/122https://wiki.openjdk.org/display/HotSpot/Caching+Java+Heap+Objects
  2. constans_pool中的其他数据将存储在本机内存(Metaspace)中,我们称之为运行时constans_pool(Special)。

相关问题