在 String[] 被垃圾回收后,String[] 中的字符串会发生啥?

Posted

技术标签:

【中文标题】在 String[] 被垃圾回收后,String[] 中的字符串会发生啥?【英文标题】:What happens to Strings inside String[] after String[] is garbage collected?在 String[] 被垃圾回收后,String[] 中的字符串会发生什么? 【发布时间】:2017-01-27 10:43:51 【问题描述】:
String s = "hello";

字符串文字在字符串文字池中具有引用,并且永远不符合垃圾收集条件。所以,在上面这行之后,即使我说:

s=null;

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

String 数组中的字符串也一样吗?假设我们有

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

这 3 个字符串对象是否仍然在从池中引用的堆上? 或者它们将与数组对象一起被垃圾回收。

【问题讨论】:

字符串文字池不是堆的一部分。见***.com/questions/4918399/… 这就是我提到“参考”的原因。根据链接中的描述,常量表(Literal Pool)存储对驻留在堆内存中的String对象的引用。 【参考方案1】:

字符串文字在字符串文字池中具有引用,并且永远不符合垃圾收集条件。

实际上,这并不完全正确……见下文。

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

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

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

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

正是那些隐藏的引用意味着池中的弱引用不会中断,相应的String 对象不会被垃圾回收。

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

【讨论】:

谢谢。好的,它们不会被垃圾收集,但仍然对池的概念感到困惑。那么池中的所有字符串都有这个弱隐藏引用吗?这个隐藏对象与常量表有什么关系?如果您可以简要介绍或引用一些有用的链接,可能会遗漏一些东西。谢谢。 我没有说存在“弱隐藏引用”。我说代码中有一个隐藏的引用,字符串池中有一个“(实际上)弱引用”。我的意思是字符串池的行为类似于弱引用,因为池中的对象不能通过池强访问。 试试看这个:java-performance.info/string-intern-in-java-6-7-8 要更深入/明确的知识,你可以阅读源代码。 Oracle 尚未就此发表任何论文等 (AFAIK)。 这有帮助。谢谢:)

以上是关于在 String[] 被垃圾回收后,String[] 中的字符串会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

JVM04——垃圾回收器和回收算法

G1垃圾回收器的String Deduplication功能是不是默认开启?

java的垃圾回收机制

python垃圾回收机制(超详细)

垃圾回收机制

第三章:回收方法区