2

クラス自体を削除した場合、その内部メソッドの実行を停止する必要がありますか? クラスAにAのArrayListからBを削除するように指示するクラスBがあります。B は A の ArrayList にしか存在しないと確信しているので、B を削除するときは削除する必要がありますよね?(注:VMがクラスを処理する方法に関係がある場合に備えて、シリアル化可能な実装を含めましたが、ここでは read- および writeObject メソッドを記述しませんでした。それが何か関係があるとは思えませんこの問題ですが。)

public class A implements Serializable, B_Listener {
    ArrayList<B> bArray;

    public A() {
        bArray = new ArrayList<SomeObject>();
        bArray.add(new B(bArray.size(), this));
    }

    @Override
    public void deleteAtIndex(int index) {
        bArray.remove(index);
    }
}

public class B implements Serializable {
    B_Listener listener;
    int index;

    public B(B_Listener listener, int index) {
        this.listener = listener;
        this.index = index;
    }

    //This is called at some point in a B's lifetime.
    private void selfDestruct() {
        listener.deleteAtIndex(index);
        Log.w("B.class", "Should this not output? It does.");
    }
}

public interface B_Listener {
    public void deleteAtIndex(int index);
}

そのため、Log.w メッセージは実行すべきでないと思われるときに実行されます。したがって、Java のメモリ リークを作成していると思います。B がポインターによって保持されている可能性がある場所を見つけようとして、コード全体を調べましたが、意図したもの以外には何も思いつきませんでした。

それで、Bが私の側で削除されたときとは異なるときにガベージが収集されるかどうかを尋ねています。もしそうなら、当分の間、私は実際に私が保持するつもりのないオブジェクトを保持していないと言っても過言ではありませんか?

余分な(注:これは従うのが難しいかもしれません、これ以上のすべてが問題に十分であるはずです):私はAndroidで開発しているので、これもAndroid-Viewsでタグ付けされています:私のBクラスは、Bを指すViewオブジェクトをリスナー。ビューを削除すると、ビュー マネージャーまたは Android が持っているものはすべてビューを指しなくなるはずです。B を削除すると、その内部ビューもすべて削除する必要があります。つまり、独自のリスナーによって B が存在し続けることはできなくなります。ポインター。ここでの私の理解が正しいかどうかを確認するために、これについて話しているだけです。

4

2 に答える 2

7

もちろん違います。

returnメソッドは、例外がスローされた場合、またはスレッドが中止された場合にのみ「実行を停止」します。

ガベージ コレクションの要点は、それが目に見えないことです。特別なトリック (WeakReferences や空きメモリのチェックなど) を除いて、オブジェクトがガベージ コレクションされたかどうかを判断することは不可能です。オブジェクトが存在するかどうかをチェックできる場合、それはそのオブジェクトへの参照があることを意味するため、オブジェクトを収集することはできません。 .

于 2012-08-13T00:37:32.537 に答える
1
  1. 通常、2 種類の GC があります。マイナー (約 1 秒ごと) とメジャー (約 1 時間ごとですが、VM に十分なメモリを与える場合は 1 週間でもかまいません)。

  2. オブジェクトは非同期で解放されます (一括で解放する方がはるかに効果的であり、メモリを断片化しないようにするのに役立ちます)。アクセスできなくなっても、ミリ秒単位で削除されることはありません。

  3. ガベージ コレクションは、オブジェクトへの参照を保持しているオブジェクトがない場合ではなく、アクティブなスレッドがオブジェクトにアクセスできない場合にのみ意味があります。コードでは、selfDestruct が実行されている限り、スレッドは暗黙的な「this」参照を所有します。これにより、実際にオブジェクトがスレッドによって参照され、GC から安全になります。

于 2012-08-13T00:46:54.057 に答える