我的物品会被垃圾收集吗?

时间:2013-09-08 13:55:55

标签: java garbage-collection

这是数据提供者:

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)?

1 个答案:

答案 0 :(得分:8)

因为您没有保留对Item个对象的引用,只保留对字符串的引用,所以Item对象符合GC的条件。字符串不是,因为它们被引用。

在循环的第一次迭代之后,你有了这个:

+------+
| item |
+------+
| text |----+
+------+    |   +---------+
            +-> | "Hello" |
            |   +---------+
+-------+   |
| texts |   |
+-------+   |
| 0     |---+
+-------+

因此,itemtexts都指向字符串,但没有任何内容指向item,因此Item可以是GC。


稍微偏离主题:

如图所示,您的示例只有一个String实例,在列表中引用了10,000次,因为它是一个字符串文字,字符串文字自动为intern。但如果在每种情况下它都是不同的字符串,答案就不会改变。字符串与Item s。

分开