这是数据提供者:
class Item {
private String text;
public Item(String txt) {
this.text = txt;
}
public String get() {
return this.text;
}
public static Item next() {
return new Item("hello");
}
}
现在我正在尝试这样做(只是一个例子,了解它是如何工作的):
List<String> texts = new LinkedList<>();
for (int i = 0; i < 10000; ++i) {
Item item = Item.next();
texts.add(item.get());
}
// do we still have ten thousand Items in memory,
// or they should already be garbage collected?
我想知道GC是否会销毁所有Item
个对象,或者它们会留在内存中,因为我的List
拥有10000个链接到他们的部分(text
)?
答案 0 :(得分:8)
因为您没有保留对Item
个对象的引用,只保留对字符串的引用,所以Item
对象符合GC的条件。字符串不是,因为它们被引用。
在循环的第一次迭代之后,你有了这个:
+------+ | item | +------+ | text |----+ +------+ | +---------+ +-> | "Hello" | | +---------+ +-------+ | | texts | | +-------+ | | 0 |---+ +-------+
因此,item
和texts
都指向字符串,但没有任何内容指向item
,因此Item
可以是GC。
稍微偏离主题:
如图所示,您的示例只有一个String
实例,在列表中引用了10,000次,因为它是一个字符串文字,字符串文字自动为intern
。但如果在每种情况下它都是不同的字符串,答案就不会改变。字符串与Item
s。