オブジェクト プーリングとは何ですか? 弱いオブジェクト参照とは何ですか?
Java を使用してそれらをどのように実装できますか?
オブジェクト プールは、アプリケーションが作成し、各インスタンスの作成にコストがかかる状況に備えて保持する特定のオブジェクトのコレクションです。良い例は、データベース接続またはワーカー スレッドです。プールは、図書館からの本のようなユーザーのためにインスタンスをチェックインおよびチェックアウトします。
通常、オブジェクト プーリングは Java EE アプリケーション サーバーによって処理されます。自分で行う必要がある場合は、Apache のオブジェクト プールなどを使用することをお勧めします。自分で書かないでください。スレッドセーフやその他の問題により、複雑になる可能性があります。
これは、弱いオブジェクト参照に関する優れたリファレンスです。
共通プールを確認する
オブジェクトプーリング API を提供します
通常、作成にコストがかかるオブジェクトに使用されます。事前に作成された N 個のオブジェクトのプールを維持し、それらを再利用することを避けるために。
弱参照は、ガベージコレクターによって特別に処理される一種の参照変数です。
これにより、別の種類の到達可能性が導入されます。どのオブジェクトも次のようになります。
(ソフト参照とファントム参照もありますが、ここでは省略します。これらは同様に機能し、より多くのレベルを導入します。)
オブジェクトにまったく到達できない場合は、いつでもガベージコレクションを実行できます。オブジェクトが強く到達可能である場合、そのオブジェクトはガベージコレクションできません。ガベージコレクターは、オブジェクト(またはオブジェクトのグループ)が弱く到達可能であることを検出した場合(おそらく複数の弱参照によって)、これらすべての参照を一度にクリアし、オブジェクトに到達できなくなります(そしてガベージコレクションできます)。
(実際には、「到達不能」とコレクションの間にファイナライズステップが存在する/存在する可能性があります。これにより、オブジェクトが再び到達可能になる可能性もあります。)
弱参照を使用する場合は、クラスを使用できます。java.lang.ref.WeakReference
実際の参照はこのクラスのプライベート変数にあり、コンストラクターでのみ設定でき、後でクリアできます。参照自体とは別に他のデータが必要な場合は、このクラスをサブクラス化できます。このデータは、参照がクリアされたときにも存在するはずです。
「コストのかかるインスタンス化を回避する」という意味でのオブジェクトプールの場合、弱参照は適切なツールではありません。
オブジェクトプールは、必要になるたびに再作成されるのではなく、リサイクルされるオブジェクトのコレクションです。
要件に応じて、このようなオブジェクトプールを実装する方法はいくつかあります。オブジェクトプールは、単純なオブジェクトでもパフォーマンスを向上させるために使用されますが、Java5以降ではそれほど有用ではありません。
ファイル、ソケット、データベース接続などの外部リソースに接続するオブジェクトにのみ使用することをお勧めします。
プーリングとオブジェクトプーリング:
プーリングとは、基本的に、クライアントが必要とする期間のみにオブジェクトへのアクセスを制限することにより、リソースを効率的に利用することを意味します。
通常、プーリングによって使用率を上げると、システムのパフォーマンスが向上します。
オブジェクトプーリングは、競合するクライアント間で有限のオブジェクトセットへのアクセスを管理する方法です。
言い換えると、オブジェクトプーリングは、異なるクライアント間でオブジェクトを共有することに他なりません。
オブジェクトプーリングではオブジェクトの共有が可能であるため、他のクライアント/プロセスはオブジェクトを再インスタンス化する必要がなく(ロード時間が短縮されます)、代わりに既存のオブジェクトを使用できます。
使用後、オブジェクトはプールに戻されます。
弱参照オブジェクト:
弱参照は、指示対象と呼ばれるオブジェクトへの参照のホルダーです。
弱参照を使用すると、ガベージコレクションを妨げることなく、指示対象への参照を維持できます。
ガベージコレクタがヒープをトレースするときに、オブジェクトへの未解決の参照のみが弱参照である場合、その指示対象は、未解決の参照がなく、未解決の弱参照がクリアされているかのようにGCの候補になります。
GCは常に、いくつかのアルゴリズムを使用して、到達しにくいオブジェクトを再利用することを忘れないでください。
Java で単純なObjectPoolを実装しました。ここを参照してください。ただし、弱いオブジェクト参照は使用しません。弱いオブジェクト参照の目的は、オブジェクトへの参照があってもオブジェクト メモリを収集できるようにすることですが、それらは弱いものです。オブジェクトプールよりもキャッシュの方が便利ですが、オブジェクトプールにも使用できます。