1

例えば:

public class Box{
    public int id;

    public Box(int id){
        this.id = id;
    }
}

ArrayList<Box> boxArray = new ArrayList<Box>();

boxArray.add(new Box(0));
boxArray.add(new Box(1));
boxArray.add(new Box(2));

for (Iterator<Box> iter = boxArray.iterator(); iter.hasNext();) {
    Box box = iter.next();

    if (box.id == 1) {
        iter.remove();
        box = null;
    }
}

私はそれを知っています:Javaでは、参照がない場合、JMはオブジェクトを削除します。

しかし

  1. 「box = null;」と設定する必要がありますか? 配列から削除した後、このコードでオブジェクトを作成しますか?
  2. オブジェクトが確実に JM から削除されることを確認するにはどうすればよいですか?
4

3 に答える 3

6

1)「box = null;」を設定する必要があります 配列から削除した後、このコードでオブジェクトを作成しますか?

いいえ、それは時間の無駄です。

2) オブジェクトが確実にメモリから削除されるようにするにはどうすればよいですか?

確実に削除されるとは限りません。ただし、 JVM がメモリを必要とする場合、到達不能なオブジェクトは確実に削除されます。そして、それが本当に重要なすべてです。


私はそれを知っています:Javaでは、オブジェクトへの参照がない場合、JVMはオブジェクトを削除します。

それは正確ではありません。私たちが言えることは次のとおりです。

  • どのライブ スレッドからもアクセスできなくなったオブジェクトは、ガベージ コレクションの対象になります。(これは、オブジェクトへの参照がないということと同じではありません。)

  • ガベージ コレクターが実行されると、通常、到達不能なオブジェクトの一部が再利用されますが、すべてのオブジェクトが再利用されるとは限りません。

  • オブジェクトにメソッドがある場合finalize、そのメソッドによってオブジェクトが再利用されないようにすることができます。

これらすべてが、「削除します」が強すぎるという事実につながります。さらに、削除はすぐには行われません。

于 2013-10-05T14:48:45.320 に答える
1

「box = null;」と設定する必要がありますか? 配列から削除した後、このコードでオブジェクトを作成しますか?

いいえ、特別な必要はありません。for ループが終了するとすぐにBox、同じ効果を持つ参照が存在しなくなるからです。Java でプログラミングする場合、メモリ管理はそれほど心配する必要がありません。

オブジェクトが確実に JM から削除されることを確認するにはどうすればよいですか?

できません。オブジェクトは、ガベージ コレクターがその必要性を感じたときにガベージ コレクションされます。

于 2013-10-05T14:49:41.803 に答える
1
  1. いいえ、すべきではありません。とにかく、「ボックス」変数はループの外には存在しません。

  2. オブジェクトが「削除された」ことを確認することはできませんし、気にする必要もありません。オブジェクトに到達できない正確な時間にメモリからオブジェクトを削除すると、非常に遅くなります。GC はバッチで動作することを好み、独自のブックキーピングを行います。

于 2013-10-05T14:49:54.217 に答える