Java 1.7 String.intern()不是JVM中的InternedString,否则我错了

Java 1.7 String.intern()不是JVM中的InternedString,否则我错了,java,literals,Java,Literals,返回字符串对象的规范表示形式。 最初为空的字符串池由类字符串私下维护。 调用intern方法时,如果池中已经包含一个字符串,该字符串等于equals(object)方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。 因此,对于任意两个字符串s和t,s.intern()==t.intern()为真当且仅当s.equals(t)为真时 这意味着文本缓存在其私有池中的String类中,但JVM achitecture表示InternetString

返回字符串对象的规范表示形式。 最初为空的字符串池由类字符串私下维护。 调用intern方法时,如果池中已经包含一个字符串,该字符串等于equals(object)方法确定的该字符串对象,则返回池中的字符串。否则,此字符串对象将添加到池中,并返回对此字符串对象的引用。 因此,对于任意两个字符串s和t,s.intern()==t.intern()为真当且仅当s.equals(t)为真时

这意味着文本缓存在其私有池中的String类中,但JVM achitecture表示InternetString:

插入字符串(字符串表) Java语言规范要求包含相同Unicode代码点序列的相同字符串文本必须引用相同的字符串实例。此外,如果对字符串实例调用String.intern(),则必须返回一个引用,如果该字符串是文本,则返回的引用将与引用返回相同。因此,以下情况是正确的: (“j”+“v”+“m”).intern()=“jvm” 在热点JVM中,插入的字符串保存在字符串表中,字符串表是一个哈希表,将对象指针映射到符号(即哈希表),并保存在永久生成中。对于符号表(见上文)和字符串表,所有条目都以规范化形式保存,以提高效率并确保每个条目只出现一次。 当类被加载时,编译器会自动将字符串文本插入并添加到符号表中。此外,可以通过调用String.intern()显式地对String类的实例进行内部调用。调用String.intern()时,如果符号表已包含该字符串,则返回对该字符串的引用;如果未包含该字符串,则将该字符串添加到字符串表并返回其引用


我的问题是,文字/字符串究竟存储在哪里?JVM文档中说是在JVM->PermGen->InternedStrings中,还是字符串API中说是在某个私有集合中的String类中?

在1.6及以下版本中,它是PermGen。从7开始,它进入了堆,我知道7中的一个point版本在工作方式上有了一些重大的变化

编辑

发现了这一点,7u40出现了巨大的变化

编辑


API说它是由类字符串(堆上的平均值)维护的。从Java8中删除Permgen。因此,它存储在堆上。

JVM可以自由地将内部字符串放在任何它想要的地方,只要它保持Java级别的语义(内部字符串和文本的引用相等)。无论您得到什么答案,在几个JVM版本中都可能过时。您是否有希望使用答案解决的实际问题,或者您只是好奇?好奇+我正在使用oracle java 1.7插入的字符串只是字符串。不同之处在于,它们会永久存在(某种程度上),如果您
intern()
多个字符相同的字符串,您会不断获得与该字符值的第一次
intern()
操作返回的字符串完全相同的字符串。JVM如何执行这一魔法不是你所担心的。答案很好。那么String.intern()API又如何呢?它是旧的还是假的?这篇文章对Java1.7和InternedStrings的理解是错误的,它们被告知存储在Java7的Permgen中。我是对的还是误解了什么?@user1308908根据上面的甲骨文(见编辑),它是在1.7Hmm中更改的。但是PermGen也是Classloader加载类定义、它们的方法、常量等的地方,对吗?那么Java8中的类和方法将加载到哪里呢?
Synopsis: In JDK 7, interned strings are no longer allocated in
the permanent generation of the Java heap, but are instead
allocated in the main part of the Java heap (known as the young
and old generations), along with the other objects created by the
application. This change will result in more data residing in the
main Java heap, and lessw data in the permanent generation, and
thus may require heap sizes to be adjusted. Most applications
will see only relatively small differences in heap usage due to
this change, but larger applications that load many classes or
make heavy use of the String.intern() method will see more
significant differences.  RFE: 6962931