簡體   English   中英

我的物品會被垃圾收集嗎?

[英]Will my objects be garbage collected?

這是數據提供者:

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

由於您不保留對Item對象的引用,而僅保留對字符串的引用,因此Item對象可以用於GC。 字符串不是,因為它們被引用。

在循環的第一次迭代之后,您將獲得:

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

因此, itemtexts指向字符串,但是沒有東西指向item ,因此可以對Item進行GC處理。


稍微偏離主題:

如圖所示,您的示例將只有一個String實例,該實例在列表中被引用了10,000次,因為它是一個字符串文字,並且字符串文字是自動intern的。 但是,如果在每種情況下都是不同的字符串,答案將不會改變。 字符串與Item分開。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM