web-dev-qa-db-ja.com

オブジェクトプーリングは非推奨の手法ですか?

私はオブジェクトプーリングの概念に非常に精通しており、常に可能な限りそれを使用するようにしています。

さらに、Java自体と他のフレームワークができるだけプールを使用することを確認したので、オブジェクトプーリングは標準的な規範であると常に思っていました。

最近、私はまったく新しい(そして直感に反する?)何かを読みました。

そのプーリングは実際には、特に並行アプリケーションでプログラムのパフォーマンスを悪化させます。代わりにnewオブジェクトをインスタンス化することをお勧めします。これは、新しいJVMではオブジェクトのインスタンス化が本当に速いためです。

私は本でこれを読みました:Java Concurrency in Practice

この本の最初の部分で、新しいインスタンスを作成する代わりにExecutorssを再利用するThreadを使用するように勧められているので、ここで何か誤解しているのではないかと考え始めています。

オブジェクトプーリングは最近廃止されたのでしょうか?

62
user10326

気づいたように、最近のJVMでは、存続期間の短いオブジェクト自体の作成と破棄(つまり、メモリ割り当てとGC)が非常に安価であるため、これは一般的な手法としては非推奨です。そのため、平凡なオブジェクトに手書きのオブジェクトプールを使用すると、プレーンなnew。*よりも遅く、複雑で、エラーが発生しやすくなります。

ただし、DB /ネットワーク接続、スレッドなど、作成に比較的コストがかかる特別なオブジェクトには、まだ使用されています。

*クロールのパフォーマンスを改善する必要があったときJava app。調査により、数百万のオブジェクトを割り当てるためにオブジェクトプールを使用する試みが明らかになりました...そして、それを書いた賢い人は単一のグローバルを使用しましたロックしてスレッドセーフにします。プールをプレーンnewに置き換えると、アプリが30倍速くなりました。

72
Péter Török

具体的な質問への回答:「オブジェクトプーリングは非推奨の手法ですか?」です:

いいえ。オブジェクトプーリングは特定の場所で広く使用されています-スレッドプーリング、データベース接続プーリングなど

一般的なオブジェクトの作成は、遅いプロセスではありませんでした。プーリング自体がメモリと処理能力というリソースを消費します。最適化はトレードオフです。

ルールは:

時期尚早の最適化は悪い!!!

しかし、与えられた最適化は時期尚早でしょうか?

プロファイリングを介してボトルネックを発見する前に、時期尚早な最適化は任意の最適化完了です。

36
Boris Yankov

ガベージコレクションを完全に避けたい状況では、オブジェクトプーリングが唯一の実行可能な代替手段だと思います。いいえ、それは絶対に非推奨の手法ではありません。

9
Jer

そのプーリングは実際には、特に並行アプリケーションではプログラムのパフォーマンスを低下させます。新しいJVMではオブジェクトのインスタンス化が非常に高速であるため、代わりに新しいオブジェクトをインスタンス化することをお勧めします。

コンテキストによって異なります。

8
user204677

測定

それは、ユースケース、オブジェクトのサイズ、JVM、JVMオプション、有効にしたGC、およびその他の要因のホスト全体に完全に依存します。

つまり、前に測定し、後に測定します。オブジェクトプーリングフレームワーク(Apacheなど)を使用していると仮定すると、実装間でスワップするのはそれほど難しくありません。

追加のパフォーマンステストのヒント-最初にJVMをウォームアップし、実行中のJVMで何度もテストを実行すると、動作が異なる場合があります。

8
Martijn Verburg

ここに傾向の変化があるかどうかはわかりませんが、それによって異なりますの場合は確かにそうなります。 JavaクラスがRMI接続やリソースファイルのロードなどの外部リソースを管理している場合-オブジェクトのインスタンス化のコストは依然として高い可能性があります(ただし、これらのリソースはあなたはすでに!)一般的な慣習として、私は本に同意します。

5
Jeremy