メモリ内に多くのオブジェクトを必要とするアプリケーションで開発しています。最大の構造の1つはタイプです
Map<String,Set<OwnObject>> (with Set as HashSet)
OwnObject は、データベース内のレコードを表す重いオブジェクトです。アプリケーションは動作しますが、メモリ フットプリントがかなり大きくなります。2001 年のこの Java Specialistsニュースレターを読んで、上記の大きな構造体のメモリ使用量を分析しました。HashSet は背後で HashMap を使用しますが、これは非常に重いオブジェクトであり、追加メモリのほとんどがここにあると思います。
構造体のメモリ使用量を最適化しようとして、複数のバージョンを試してみました。
Map<String,List<OwnObject>> (with List as ArrayList)
Map<String,OwnObject[]>
どちらも機能し、どちらも Set<> を使用したバージョンよりもはるかに無駄がありません。ただし、セット コントラクト (エントリの一意性) は維持したいと思います。
1 つの方法は、自分でロジックを実装することです。ArrayList を拡張して、add() でコントラクトを確保できます。
Set コントラクトを尊重する軽量コレクションを実装するフレームワークはありますか? それとも、一意性を自分で確認せずに使用できる Java コレクションの何かが欠けているのでしょうか?