3

C++ では、参照カウント オブジェクトを使用して、「自動」リサイクル オブジェクト プールの for を実装します。

SmartPointer<ObjType> object = pool.getObject(); // hold reference

// ... do stuff with object over time.

object = nullptr; // that is when reference 
                  // count goes to 0

-- これで、refcount が 0 に達したときに呼び出される "onFinalRelease()" メソッドが C++ オブジェクトにあります。これをオーバーライドして (デフォルトは delete(this) です)、オブジェクトを破棄するのではなく、オブジェクトを自動リサイクルすることができます。

問題は、Java 参照型と参照プールを組み合わせてこのパターンを実装できるかどうかです。もちろん、これは意味のあるオブジェクトを作成するのにコストがかかる大規模な複雑なタイプのためのものです。それは私がやりたいことです:

SomeReference r = referenceQueue.getReference();

pool.recycle(r.takeBackUnusedObjectFromGC()); // ??????????????????????????

これは本当にいいでしょう:)

4

4 に答える 4

7

s を使用PhantomReferenceして、このようなことを行うことができます。高価なオブジェクトへの (強力で一方向の) 参照を持つインターフェイス (プロキシ) オブジェクトを用意します。また、プール管理で高価なオブジェクトへの強力な参照を維持します。PhantomReferenceインターフェイス オブジェクトにa を保持します。が表示PhantomReferenceされるReferenceQueueと、高価なオブジェクトがインターフェイス オブジェクトを介して使用されていないことを確認できます (ファイナライズを許可しても)。高価なオブジェクトは、新しいインターフェイス オブジェクトで再利用できるようになりました。

ただし、おそらくそれだけの価値はありません。

于 2012-01-09T20:16:36.873 に答える
1

参照カウントでは、オブジェクトがガベージになる時期、つまり参照カウントがゼロになる時期が明確に定義されています。Java のガベージ コレクションでは、特定のオブジェクトへの強い参照がなくなったとしても、そのオブジェクトがガベージ コレクションされるという保証はありません。

独自の参照カウンターを手動で実装することが、私が考えることができる最良の解決策です。

于 2012-01-09T20:13:55.600 に答える
0

Java には、 finalizeメソッドと呼ばれる同様のものがあります。残念ながら、一度オブジェクトに対して実行すると、元に戻すことはできません。さらに、実行することさえ保証されていません。

オブジェクトのプールを作成し、再利用できるかどうかを追跡するのが最善の策かもしれません。これにはApache Commons Poolが役立つかもしれません。

于 2012-01-09T20:11:48.610 に答える
0

このクラスは、あなたが探しているものかもしれません:

https://commons.apache.org/proper/commons-pool/apidocs/org/apache/commons/pool2/impl/SoftReferenceObjectPool.html

于 2015-11-25T09:46:35.173 に答える