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 がすべてのオブジェクトを破棄するのか、それともオブジェクトのパーツへの 10000 個のリンクを保持しているItemため、オブジェクトがメモリに残るのか疑問に思います ( )。Listtext

4

1 に答える 1

8

オブジェクトへの参照を保持しているのではなくItem、文字列への参照のみを保持しているため、Itemオブジェクトは GC の対象となります。文字列は参照されているため、そうではありません。

ループの最初の繰り返しの後、次のようになります。

+--------+
| | アイテム |
+--------+
| | テキスト |----+
+--------+ | +---------+
            +-> | "こんにちは" |
            | | +---------+
+--------+ |
| | テキスト | | |
+--------+ |
| | 0 |---+
+------+

したがって、 と の両方itemtexts文字列を指しますが、 を指すものは何もないitemため、ItemGC できます。


少しトピックから外れています:

String示されている例には、リスト内で 10,000 回参照されるインスタンスが1 つしかありませんintern。しかし、それぞれの場合で異なる文字列であったとしても、答えは変わりません。文字列はItems から分離されています。

于 2013-09-08T13:59:39.040 に答える