2

私はn00bなので、これでうまくいかない場合は申し訳ありませんが、いくつかのスレッドが処理するためのキューとしてarraydequeを使用しています。各スレッドはキュー内のアイテムを処理します(各スレッドはキューにデータがあるかどうかをチェックし、データがある場合はqueue.poll()を実行します。問題がない場合は、ソリューションキューに送信されます。それ以外の場合は、データが破棄されるか、その一部は、さらに処理するためにキューに送り返されます。

これが私の問題です。プログラムが長く動作するほど、より多くのメモリを使用し続け、最終的にはメモリ不足エラーが発生します(ただし、これが発生する前にしばらくの間最大になります)。私はJavaを学んでいるので、これを正しく識別したかどうかはわかりませんが、コードでyourkitを実行すると、次のように表示されます。

Find arrays with big number of 'null' elements.
Problem: Possible memory waste.
Possible solution: Use alternate data structures e.g. maps or rework algorithms.

yourkitは、私のメモリの93%がここ(ヒープダンプ内)でスタックしていることも示しました。昨日、arraydeque.polling()がメモリを大量に消費する可能性があることについて質問したところ、ポーリング後にデータが「null」に変わったためではないというコメントがありました。

それで、私の2つの質問(私のタイトルのように)は、絶えず増加するnullオブジェクトの問題を抱えています(それらがGCされるかどうかはわかりませんが、ヒープダンプに数百万があったので、おそらくそうではないと思います)?もしそうなら、ArrayDequeの代わりに、おそらくGCのアイテムが不要になったときに何かがあります(私のプログラムは常にアイテムを処理してキューに追加していますが、処理するアイテムの数が減ってもメモリ消費量は決して増えませんダウン、プログラムが完了すると、突然ゼロになります。キューが徐々に構築されている場合は、徐々に小さくなると思います)?

もう1つの少し関連する質問ですが、スレッドによって処理されているキュー内の数十億のアイテムを処理していますが、メモリが原因で失敗しています。内部プログラムキューを改善しようとするポイントはありますか、それとも(rabbitmqまたはactivemq)のような実際のキュープログラムを使用する方が理にかなっていますか?(プログラムは本当に新しいので、いつ制限に達したのかわかりませんツールとそれを改善する方法、または次に何を使用するかを理解する方法)

4

2 に答える 2

4

実装が内部配列を縮小することは決してないように見えるArrayDequeので、それは永遠に成長し続けるだけです。オブジェクトが両端キューからポーリングされると、対応する配列要素がに設定されnull、オブジェクトは最終的にガベージコレクションされます(オブジェクトへの他のすべての参照も消えた場合)。しかし、の内部配列ArrayDequeは成長し続けています。

Dequeインターフェースもとによって実装されLinkedListConcurrentLinkedDequeいるので、おそらくそれらの1つを使用するのが最善です。

于 2012-04-13T21:50:21.710 に答える
4

ArrayDeque頭と尾の2つの「ポインタ」を使用してアイテムをフラット配列に格納します。キュー内の要素の総数がこの配列の現在のサイズを超えると、そのサイズは2倍になります。

キューからアイテムをポーリングすると、この配列のスロットはクリアされます(に設定されnullます)が、配列が実際に縮小することはありません。つまり、最初に100万個のアイテムをキューに提供し、次にそれらすべてをポーリングした場合ArrayDequeでも、少なくとも100万個のエントリの配列が維持され、すべてがに設定されnullます。これは、多数の「null」要素を持つ配列の検索メッセージについて説明しています。

ある時点でのアプリケーションがキューに膨大な数の要素を提供しているようです。次のコードを(定期的に?)呼び出してみてください。

queue = new ArrayDeque<String>(queue);

queueこれにより、古いガベージコレクションの内容が不必要に大きな内部配列にコピーされます。

nullオブジェクトのようなものはないことに注意してください-キューからアイテムを削除し、このアイテムがコードによって参照されなくなった場合-ガベージコレクションされます。

于 2012-04-13T21:57:59.500 に答える