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个字符串对象是否仍然在从池引用的堆上?,或者它们是否有资格与数组对象一起进行垃圾回收。
答案 0 :(得分:4)
字符串文字在String Literal Pool中有引用,并且不符合垃圾回收的条件。
实际上,这不是严格正确的......见下文。
3个字符串对象是否仍然在池中引用的堆上?或者他们将有资格与数组对象一起进行垃圾收集。
他们不会被“从池中”引用。池中的引用是(实际上)弱引用。
他们没有资格进行垃圾收集。
实际上将要发生的是,源代码中与字符串文字对应的String
个对象(在字符串池中)将由使用该文字的代码引用;即,JVM知道的隐藏对象中存在隐藏引用。这些引用是JVM在您(例如)将字符串文字分配给某些内容时使用的内容...
这些隐藏引用意味着池中的弱引用不会中断,并且相应的String
对象不会被垃圾收集。
现在,如果定义文字的代码是动态加载的,并且应用程序设法卸载代码,那么String
对象可能无法访问。如果发生这种情况,它们最终将被垃圾收集,