多数(数百万)の長期存続オブジェクトを持つアプリケーションのヒープ サイズの使用を最適化するにはどうすればよいでしょうか? (大きなキャッシュ、データベースから大量のレコードをロード)
- 適切なデータ型を使用する
- 他のデータ型を表すためにjava.lang.Stringを使用しない
- 重複したオブジェクトを避ける
- 値が事前にわかっている場合は列挙型を使用する
- オブジェクトプールを使用する
- String.intern() (良いアイデアでしょうか?)
- 必要なオブジェクトのみをロード/保持する
一般的なプログラミングまたは Java 固有の回答を探しています。奇妙なコンパイラ スイッチは不要です。
編集:
ヒープ内に何百万回も出現する可能性がある POJO のメモリ表現を最適化します。
ユースケース
- 巨大な csv ファイルをメモリにロードする (POJO に変換)
- Hibernateを使用してデータベースから数百万件のレコードを取得する
回答の要約:
- フライウェイトパターンを使用する
- コピーオンライト
- 3 つのプロパティを持つ 10M のオブジェクトをロードする代わりに、サイズが 10M の 3 つの配列 (またはその他のデータ構造) を持つ方が効率的ですか? (データの操作は面倒かもしれませんが、メモリが本当に不足している場合は...)
ベストアンサー1
メモリ プロファイラーを使用して、メモリが消費されている場所を確認し、最適化することをお勧めします。定量的な情報がないと、効果がないか、実際に状況を悪化させるような変更を行ってしまう可能性があります。
特にオブジェクトが小さい場合は、データの表現方法の変更を検討できます。たとえば、行ごとに 1 つのオブジェクトではなく、列ごとにオブジェクト配列を持つ一連の列としてデータ テーブルを表すことができます。これにより、個々の行を表す必要がない場合に、各オブジェクトのオーバーヘッドを大幅に削減できます。たとえば、12 列と 10,000,000 行のテーブルでは、1000 万 (行ごとに 1 つ) ではなく、12 個のオブジェクト (列ごとに 1 つ) を使用できます。