2012-01-19 4 views
3

GCは問題のオブジェクトを指す参照を持たないオブジェクトを収集するが、リスナーオブジェクトのイベントはどうなるのだろうか?GCはオブジェクトの収集時期をどのように知っていますか?

DataSupplierのデータをリッスンするAnimationDelegateがあるとします。 DataSupplierがデータを受信して​​イベントをAnimationDelegateに送信すると、代理人はGraphicを無効にします(/更新/再描画など)。ここでは、画面が無効になっている、削除されている、またはさまざまな方法で、グラフィックを描画できなくなり、収集されたとします。 AnimationDelegateはまだDataSupplierに登録されています。 GCはそれをどのように収集することを知っていますか?デリゲートをグラフィックスfinalize()メソッドで登録解除する必要がありますか?

+0

リファレンスカウントを使用します。基本的に、オブジェクトへのポインタがなくなると、次のGCパスでガベージコレクションされます。 – aroth

+0

@arothそうではありません。 – alf

+0

実際はすべて実装に依存します。いくつかは依然として参照カウントを使用していますが、HotSpot JVMに付属のGCはそうではないと思います。 –

答えて

3

答えがフォーマットに合わないことがあります:) this articleで始まるBrian Goetz:彼はGCに興味があれば読むのに最適な人物です。

基本的に、オブジェクトがアクティブスレッドからに届かないとに到達するとすぐに、それが収集されます。実際のアルゴリズムは1つのJVM内でも異なりますが、ポイントは同じままです。到達できないのはゴミです。到達可能なものはゴミではありません。簡単です。それはいくつかのアクティブなスレッドから到達可能であると考えられるDataSupplierから(サブスクリプションを経由して)順番に到達可能である、AnimationDelegateから到達可能だとして

GCは、あなたの例ではGraphicを収集することはありません。あなたの前提は間違っています。 GCはここで何も収集しません。

あなたの質問に答えるには、必要のないものをすべて退会させてください。

@rfeakは正当に言うと、finalize()は大きなノーではありません。正しく使用することはほとんど不可能です。使い方が間違っています。つまり、リソースを解放する必要がある場合は、バックアップソリューションとして使用しても問題ありません。しかし、一般にあなたのアプリケーションfinalize()が呼び出されなくても、うまく動作するようににしなければなりません。

0

参照を削除したかどうかだけを知ることができます。

しかし、finalize()ではこれを行わないでください。ファイナライズは悪い悪いです。リスナー(オブザーバー)タイプのオブジェクトをクリーンアップするには、他のライフサイクルメソッドが用意されている必要があります。

ちなみに、GCが残っている参照のためにGCを収集できなかったため、オブザーバパターンはメモリリークを引き起こすことで有名です。

+0

それは私が実現していたことです(しかし、私が間違っていたことを秘密裏に期待していました...)。私はここに座って私のドローイングのことに取り組んでいて、思考が私に起こりました。 – AedonEtLIRA

+0

@amit説明してください。 – AedonEtLIRA

+2

最初のステートメントはまったく真実ではないようですが、java gcは参照の循環性を扱うことができますが、「あなたがそれらを除外した場合にのみ知る」という素朴なモデルはできません。モデル内に参照を含むモデルがあるとします。オブジェクトBにつながるフィールドを持つオブジェクトAを持っているとします。あなたのプログラムから誰もアクセスできない場合は、それらの参照は無効にされませんが、ガベージコレクションされます。 \ – amit

2

すべては、使用しているJVMとGCによって異なります。 JDKのほとんどのデフォルトGCは、所与のルートのセットから始まり、そのセットから到達可能なすべてのオブジェクトをトレースする、いわゆる「トレースコレクタ」を使用します。メモリ内の他のすべてのオブジェクトはガベージとして見られ、削除されます。したがって、循環参照は、オブジェクトの1つがルートセットから到達可能でない限り、実際には問題になりません。

オブジェクトのルートセットとは何ですか?メモリが適切に機能するかどうかは、プログラムレジスタ、各スレッドのスタック内のローカル変数、および静的変数にあります。

オブジェクトがGC化されるかどうかを確認するには、アプリケーションの設計についてもっと知りたいと思います。

@編集:ああ、私はほとんど忘れてしまった:http://java.sun.com/j2se/reference/whitepapers/memorymanagement_whitepaper.pdf これはどのように動作するかを概観したものです。

関連する問題