java - String[] 被垃圾回收后,String[] 内的字符串会发生什么?

标签 java string garbage-collection

String s = "hello";

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

s=null;

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

对于 String 数组中的字符串也同样适用吗?假设我们有

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

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

最佳答案

String literals have references in String Literal Pool and are not eligible of garbage collection, ever.

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

Will the 3 string objects still be on heap referenced from pool? or they will be eligible for garbage collection along with array object.

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

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

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

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

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

关于java - String[] 被垃圾回收后,String[] 内的字符串会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41892091/

相关文章:

java - NoClassDefFoundError : kafka/api/OffsetRequest

c - 如何一次输入二维字符串的所有元素?

java - 为什么我在此代码中遇到输入 MIsmatch 异常?

java - Full GC 后 OldGen 使用率上升

.net - 为什么使用大对象堆以及我们为什么关心?

android - BroadcastReceiver 生命周期——静态变量

java - Java中有什么方法可以在不传输或下载的情况下获取图像的宽度和高度?

java - 如何在android中将帧缓冲区发送到surfaceflinger?

等待死进程完成的java线程

Java 正则表达式问题