字符串池-字符串是否始终存在于常量池中?

时间:2019-08-08 13:48:36

标签: java string new-operator pool

使用文字创建字符串时,它将存储在池中。但是,当使用new运算符创建String对象时,它将对象存储在Heap中。

但是堆中的对象只是指向存储在池中的文字的指针,还是存储在堆中且符合GC条件的简单String对象?

1 个答案:

答案 0 :(得分:2)

术语:

  • 常量池是(每个).class文件中的一个区域,其中包含各种常量,包括字符串。常量池中没有 runtime 对象。它是文件的区域。

  • 字符串池是JVM用于管理某些类型的字符串的运行时数据结构。 (具体来说,与文字相对应的String个对象,以及String添加到池中的String::intern()个对象。)

您的问题实际上是在谈论字符串池,而不是常量池。


要回答您的问题:

  

字符串池-字符串是否始终存在于常量池中吗?

不。在两个字符串池中都不存在使用new String()创建的字符串对象。例如。

  

使用文字创建字符串时,它将存储在池中。

在字符串池和常量池中。

  

但是当使用new运算符创建String对象时,它将对象存储在Heap中。

是的。但是字符串池也是堆的一部分。就像我说的那样,它是一种数据结构,而不是存储区域。

(过去,字符串池生活在一个称为PermGen堆的特殊堆中。但是PermGen被其他东西(MetaSpace)所替代,并且字符串池不再使用任何一个……。

  

但是堆中的对象只是指向存储在池中的文字的指针,还是存储在堆中且符合GC条件的简单String对象?

这真的很困惑。

所有字符串在(a)堆中均表示为String对象。甚至字符串池中的字符串。即使字符串池位于PermGen中。

所有无法访问的字符串都可以进行垃圾回收。甚至字符串池中的字符串。甚至代表字符串文字的字符串。

但是...等等...那么字符串文字可以被垃圾回收吗?

是的!如果表示字符串文字的String对象在运行时变得不可访问,则它有资格进行垃圾回收,就像其他任何String对象一样。

如果该字符串文字的代码对象变得不可达,则字符串文字可能变得不可达。当类加载器无法访问时,可能会发生这种情况。

是的,收集了PermGen 垃圾。至少从JDK 1.2起。 (IIRC Java 1.0和1.1可能没有为PermGen堆实现GC。但这是固定的。)