1

非常に頻繁に作成/破棄され、同時に多くのリストに存在する可能性のあるオブジェクトがいくつかあります。それらへの参照が残っていないことを確認するために、オブジェクトにはフラグ isDestroyed があり、これが設定されている場合、各リストはリストからオブジェクトを削除する責任があります。

ただし、これはもちろん、メモリ リークの原因となります。リストの 1 つからオブジェクトを削除するのを忘れた場合はどうなりますか? プログラムが正しく動作することを視覚的に監視するために、ファイナライズをオーバーライドし、グローバル変数を増やして破壊を追跡します (正式なテストではなく、アイデアを得るためだけです)。ただし、GC を制御できないため、理論上は何かが破壊されるまで永遠に待つことができます。

したがって、問題は 2 つあります。オブジェクトが複数のリストにある場合、「isDestroyed」はオブジェクトの有効期間を制御する良い方法と見なされますか? そのオブジェクトを使用するすべての人が、そのオブジェクトをリストから削除するように注意する必要がありますが、これは悪いことのように思えます。

また、オブジェクトの参照カウントがいつゼロになるか、つまりいつ破棄がスケジュールされているかを確認する良い方法はありますか?

編集:より具体的に言うと、私の場合、オブジェクトは部屋の物理的なエンティティを表します。また、各オブジェクトを描画するマネージャー クラスが 1 つあるため、1 つのリストに含まれています。別のリストには、クリック可能なすべてのオブジェクトが含まれているため、別のリストがあります。この場合、すべてのオブジェクトを 1 つのリストに入れ、ポリモーフィズムまたはインスタンスを使用することはできません。オブジェクトが「破棄」されると、表示されたりクリック可能になったりしてはならないため、両方のリストから削除したいと考えています。

4

4 に答える 4

2

java.lang.refパッケージを見てください。

また、オブジェクトの参照カウントがいつゼロになるか、つまりいつ破棄が予定されているかを確認する良い方法はありますか?

ReferenceQueueオブジェクト を使用できます

JavaDocからjava.lang.ref.ReferenceQueue

適切な到達可能性の変更が検出された後、登録された参照オブジェクトがガベージ コレクターによって追加される参照キュー。

于 2012-04-18T20:47:38.030 に答える
1

これが通常処理される方法は、Observer パターンを使用することです。各リストには、破棄時に通知される destroy-listener がアタッチされています。これがあなたのアーキテクチャとどのように調和しているか、判断する詳細はありません.

于 2012-04-18T21:12:43.877 に答える
1

これがWeakReferenceとReferenceQueueの目的だと思います-追跡しているオブジェクトのWeakReferenceを作成し、それをReferenceQueueに関連付けます。次に、ReferenceQueue.remove() から返された WeakReference を処理する別のスレッドがあります。参照されるオブジェクトが GC されると、WeakReference が ReferenceQueue に追加されます。しかし、参照されたオブジェクトが死んでいるときにクリーンアップしようとしているこれらのリストの例を挙げていただけますか?

于 2012-04-18T20:47:55.933 に答える
0

通知を受け取りたい場合は、PhantomReference が必要であることはほぼ間違いありません。こちらをお読みください。

http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

于 2012-07-20T23:59:10.740 に答える