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/