メモリ内のオブジェクトの数を減らしたい。同じ値を持つオブジェクトが多数存在する場合があります。ヒープダンプで同じ値を持つすべてのオブジェクトを見つける方法はありますか?
3 に答える
メモリ内のオブジェクトの数を減らしたい。同じ値を持つオブジェクトが多数存在する場合があります。
あなたの長期的な目標は、同じ値を持つオブジェクトのコピーを 1 つだけ保持することで、アプリケーションのメモリを節約することだと思います。
この考え方の問題は、通常、同じ値を持つ以前のオブジェクトを見つけることができるように、追加のデータ構造を構築/維持する必要があることです。たとえば、HashMap です。(Guava interner のような既製のソリューションは、ボンネットの下では同じです。) 注意しないと、このデータ構造は、重複を排除することで節約できるよりも多くのメモリを使用する可能性があります。
また、適切に実装されていない場合、「interning」データ構造は、オブジェクトがガベージ コレクションされるのを防ぐことによって、効果的にメモリ リークを起こす可能性があります。メモリ リークの問題の解決策にはすべて、何らかのレベルで WeakReferences などを使用することが含まれます。つまり、オブジェクトがさらに多くなり、ガベージ コレクションが遅くなります。後者の理由は、1) インターンされたオブジェクトを GC で追跡する必要がある、2) インターンされたオブジェクトがより長く存続する傾向があり、古い世代で終了する可能性が高い、3) GC にとって WeakReference インスタンスが比較的高価であるためです。対処する。
要約すると、記憶の問題を悪化させないように注意してください。
プロファイラーを使用します。YourKit にはこの機能があると言えます。
メソッドの Sun/Oracle Java 実装を見てくださいInteger.valueOf(int i)
。一般的な値 (-128 から 127 まで) の事前定義されたキャッシュが既にあるため、それらの値に対してそのメソッドを呼び出しても、新しいインスタンスは作成されません。
これは、オブジェクトの作成に注意すれば、メモリ フットプリントを抑えることができることを示しています。おそらく、オブジェクトがどのように作成されているかを調査し、作成時にそれらをキャッシュするようにしてください。おそらく、一般的なユースケースを調べたり、アプリケーションの動作のプロファイリングを行ったりすることによって. これはアプリケーションに依存するものであり、すぐに使用できるソリューションがあるかどうかは疑わしい. これにより、現在スペースを取りすぎているものを解決しようとするよりも、長期的には労力を節約できると思います.