2016-09-06 6 views
0

たとえば、ArrayListでは、各項目が非常に大きく、リストのサイズがメモリのサイズを超えるのに十分な大きさになる可能性があります。このような状況でリストを拡大する戦略は何ですか?Javaリスト展開戦略

すべての返信いただきありがとうございます。私はリモート呼び出しによってオブジェクトのリストを受け取るというこのような問題に遭遇しました。リストの各オブジェクトはかなり大きく、リストのサイズは10000以上になることがあります。実行中にこのリストをどのようにメモリに保存するのだろうか。

List<BigItem> list = queryService.queryForList(params...);

+2

各項目が非常に大きいという事実は、ArrayListを拡張することとはあまり関係ありません。 ArrayListが大きくなると、* references *の配列が拡張されるため、要素が何であっても常に同じ量のメモリによって拡張されます。メモリを消費するものは実際のオブジェクトがリストに追加されることです。それらのオブジェクトを多数作成する場合は、それらをリストや配列などのコレクションに入れるかどうかは関係ありません。ですから、今あなたの問題が何であるかがはっきりしていないので、あなたの質問をより詳細に説明してください。 – RealSkeptic

+1

リストを展開しません。一度にすべてをメモリに保存しないように戦略を変更します。 – chrylis

答えて

1

あなたの質問は非常に一般的ですが、私はそれにもかかわらず答える特定の「ベースの事実を」与えることができると思う:

をセットアップは、メモリがボトルネックになっていることなどである場合には、アプリケーションはその事実を認識する必要があります。換言すれば、アプリケーション内に測定値を実装する必要があります。

リストを「育てる」(そして、そのような高価なオブジェクトを「読み込む」)ことが可能かどうかを決定するためにアプリケーションを有効にする必要があります。

単純な開始点が記載されていますhere;もちろん、これは実際には複雑な作業です。あなたのコードは常にメモリ使用量を監視しなければなりません。あなたの限界に近づいたら適切な措置を講じる必要があります。

を実際にに、を理解する必要があります。アプリケーションのメモリ消費 "動作"。あなたのアプリケーションにさまざまなメモリリークが発生した場合など、「自己制御」にすることは何の意味もありません。または、あなたのコードがガベージコレクタを常に回転させるレートで「ガベージ」を生成している場合。

ここでは、多くの側面があります。あなたはそれらを一つずつ集中させるべきです。まずを理解してアプリケーションを起動してください。 "ガベージコレクション"の動作を改善する必要があるかどうかを判断します。あなたが9ヤードまで下がってアプリケーションを自分で管理させるならば!

関連する問題