什么时候字符串在java中被垃圾收集

Vic*_*tor 59 java string garbage-collection

在Java中,当一个对象没有实时引用时,它有资格进行垃圾回收.现在在字符串的情况下,情况并非如此,因为字符串将进入字符串池,JVM将使对象保持活动状态以便重用.这意味着一旦创建的字符串"永远不会"被垃圾收集?

Ste*_*n C 70

现在在字符串的情况下,情况并非如此,因为字符串将进入字符串池,JVM将使对象保持活动状态以便重用.这意味着一旦创建的字符串"永远不会"被垃圾收集?

首先,只有字符串文字1才能自动插入/添加到字符串池中.除非您的应用程序明确调用,否则应用程序创建的字符串不会被实现String.

其次,实际上String池中的垃圾收集对象的规则与其他Strings/other对象的规则相同.如果字符串变得无法访问,它们将被垃圾收集.

实际上,与String文字对应的String对象通常不会成为垃圾收集的候选对象.这是因为在使用文字的每个方法的代码中都存在对字符串对象的隐式引用.这意味着只要可以执行该方法,就可以访问String.

但是,情况并非总是如此.如果文字是在动态加载的类中定义的(例如使用String.intern()),那么可以安排卸载类.如果发生这种情况,那么文字的String对象将无法访问,并且当包含实习字符串的堆得到GC时将被回收.


1 - 说所有字符串文字都是实习是不正确的.如果字符串文字仅作为(编译时)常量表达式(JLS 15.28)的子表达式出现在源代码中,则该文字不会以任何形式出现在".class"文件.这样的文字不会被实习,因为它不会在运行时存在.


SLa*_*aks 8

你是对的; 实习池中的字符串永远不会是GC.

但是,大多数字符串都没有实习.
字符串文字被实习,传递给的字符串String.intern()被实习,但所有其他字符串都没有被实习,并且可以正常进行GC.

  • "实习池中的字符串永远不会是GC." - 对于现代的Hotspot JVM来说,这是不正确的.它更复杂...... (12认同)
  • @Jaskey - 你刚用`new`创建的String不会被实习.表示字符串文字*的String对象将被实现. (5认同)
  • @RamanSahasi - 它并没有过时。首先,它从来就不是完全正确的。 (3认同)
  • 请记住,"文字字符串"占用存储空间,因为它们实际上是程序的一部分.他们必须在那里或你的程序将丢失一些东西. (2认同)
  • 请注意:此答案已过时,不适用于现代JVM。 (2认同)