2009-08-04 6 views
5

のガベージコレクションを待ってこれを見つけた: 私はちょうどコモンズ-IOライブラリの中を掘った特定のオブジェクト

 
Keeps track of files awaiting deletion, and deletes them when 
an associated marker object is reclaimed by the garbage collector. 

この

FileCleaningTrackerオブジェクトのドキュメントに記載されています。

今私は自分でこれをどうやってできるのか不思議です。ガベージコレクタによってオブジェクトが再利用されたとき、私のコードでどのように検出できますか?

答えて

9

the source codeによれば、PhantomReferenceクラスを使用します。ドキュメントによれば、コレクタの後にエンキューさ

ファントム参照オブジェクトは、それらの言及は、そうでなければ再生することができると判断します。 ファントム参照は、Java終了化メカニズムで可能なよりも柔軟性の高い方法で、死亡前のクリーンアップアクションのスケジューリングに最もよく使用されます。

ある時点でファントム参照の対象がファントム到達可能であると判断した場合、その時点または後で参照をエンキューします。

再生可能オブジェクトが確実に残るように、ファントム参照の参照先は取得できません。ファントム参照のgetメソッドは常にnullを返します。

ファインリファレンスは、ファインリファレンスとは異なり、ガベージコレクタによってキューに登録されると自動的にクリアされません。ファントム参照を介して到達可能なオブジェクトは、そのような参照がすべてクリアされるか、それ自体が到達不能になるまでそのままになります。 - 新しいファントム参照が

qを参照するオブジェクト - 参照が登録され、または場合はnullされるべきでキュー

referent

PhantomReferenceコンストラクタは2つの引数を受け付け登録は不要です

q引数はinst ReferenceQueueクラスのance。 referentがファントム到達可能になるとPhantomReferenceがこのReferenceQueueに追加されます。この場合、ReferenceQueueクラスのpoll()またはremove()メソッドを使用してPhantomReferenceを取得できます。例えば

T objectToWatch = ...; 
ReferenceQueue<T> referenceQueue = new ReferenceQueue<T>(); 
new PhantomReference<T>(objectToWatch, referenceQueue); 

// Later on, probably in another thread... 
Reference<? extends T> nextReference = referenceQueue.remove(); 
// Tidy up! 

注:PhantomReferenceも使用であってもよいSoftReferenceWeakReferenceという名前の兄弟クラスがあります。これらの関係はjava.lang.ref package documentationに記載されています。

1

実際にあなたの質問に答えても、リソースの再生前にオブジェクトのfinalize()メソッドが呼び出されているかどうかは不明です。

編集:これは、メッセージを別のオブジェクトに送信して、警告を出すことができることを意味します。

+4

この目的でファイナライザを使用しないでください。回避できない場合は、ファイナライザを使用しないでください。 finalize()メソッドがガベージコレクションの後すぐに呼び出されるか、まったく呼び出されないという保証はありません(Effective Java 2nd Ed、Item 7を参照)。 java.lang.refパッケージを使用してください。 – Leigh

+0

助けることができれば、ファイナライザを使用しないでください! http://stackoverflow.com/a/158791/74694 –

関連する問題