私は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)のような実際のキュープログラムを使用する方が理にかなっていますか?(プログラムは本当に新しいので、いつ制限に達したのかわかりませんツールとそれを改善する方法、または次に何を使用するかを理解する方法)