0

这是数据提供者:

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

4

1 回答 1

8

因为您没有保留对Item对象的引用,而只是对字符串的引用,所以这些Item对象有资格进行 GC。字符串不是,因为它们被引用。

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

+------+
| 项目 |
+------+
| 正文 |----+
+--------+ | +----------+
            +-> | “你好” |
            | +----------+
+--------+ |
| 文本 | |
+--------+ |
| 0 |---+
+-------+

所以item和都texts指向字符串,但没有任何东西指向item,因此Item可以进行 GC 处理。


有点题外话:

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

于 2013-09-08T13:59:39.040 回答