在String []收集垃圾后,String []中的字符串会发生什么?

时间:2017-01-27 10:43:51

标签: java string garbage-collection

String s = "hello";

字符串文字在String Literal Pool中有引用,并且不符合垃圾回收的条件。因此,即使我说:

,在上面的行之后
s=null;

我理解,字符串对象“hello”仍将在堆中。资料来源:https://www.javaranch.com/journal/200409/ScjpTipLine-StringsLiterally.html

对于String数组中的字符串是否也适用?假设我们有

String[] arr = {"one","two","three"};
arr=null;

3个字符串对象是否仍然在从池引用的堆上?,或者它们是否有资格与数组对象一起进行垃圾回收。

1 个答案:

答案 0 :(得分:4)

  

字符串文字在String Literal Pool中有引用,并且不符合垃圾回收的条件。

实际上,这不是严格正确的......见下文。

  

3个字符串对象是否仍然在池中引用的堆上?或者他们将有资格与数组对象一起进行垃圾收集。

他们不会被“从池中”引用。池中的引用是(实际上)弱引用

他们没有资格进行垃圾收集。

实际上将要发生的是,源代码中与字符串文字对应的String个对象(在字符串池中)将由使用该文字的代码引用;即,JVM知道的隐藏对象中存在隐藏引用。这些引用是JVM在您(例如)将字符串文字分配给某些内容时使用的内容...

这些隐藏引用意味着池中的弱引用不会中断,并且相应的String对象不会被垃圾收集。

现在,如果定义文字的代码是动态加载的,并且应用程序设法卸载代码,那么String对象可能无法访问。如果发生这种情况,它们最终将被垃圾收集,