2011-03-17 11 views
0

私は1200万エントリを含むHashMapを持っています。 Stringの値をLongの値にマッピングします。各文字列は約10文字です。このマップでRAMに必要なメモリ量を計算することは可能ですか?オブジェクトが使用するRAMの量はどのようにして計算できますか?

+2

おそらく多すぎます。 :) –

+1

正確な答えが必要なのか、このルックアップにディスクベースのアプローチを使用するかどうかを決定するために、おおよその答えを探していますか? – DJClayworth

+0

最初に少し追加してみてください.100万のようにjmap -histo (JDKのbinディレクトリにあります)を使用して、HashMap、Strings、Longのメモリ使用量を得ることができます。 – Koekiebox

答えて

0

JVMはメモリを割り当てて管理する必要があるため、あなたにはわかりません。つまり、ネイティブには足りない、いいえ、あなたのオブジェクトが実際にどれだけのメモリを使用しているかを知る方法はありません。

1

あなたは推測することができますし、マップに入る各アイテムのサイズを調べることによって、推測された推測をすることができますが、最高の教育上の推測は間違っています。

JVMには、参照を追跡し、クラスのタイプ情報を保持するために使用される他の構造があります。これは、正確で(正確な入力見積もりを出すことができるならば)推定値に固定された未知の量のメモリを追加します。

メモリの一部だけがデータを直接保持するメモリであり、メモリの一部はデータを保持するオーバーヘッドとして使用されるメモリであるため、メモリ消費をプロファイルし、メモリの予測"小さい地図を使用するとき。

JVMのプロファイリングは、JVMの実行時間、マップのアクティビティなどによってさまざまな結果が現れるように、メモリ使用量を最適化するため、難しい作業です。統計的に行う必要がありますさまざまな条件での入力のサンプリング。しかし、オッズは結局あなたが最終的に合理的な数にあなたの指を置くことができるようになります良いです。さらに重要なことに、「これは一時的にこの数字の周りでピークに達するかもしれませんが、平均してこれに落ち着くはずです」と言うことができます。静的解析では、メモリの一時的な変更が見落とされることがよくあります。

0

プロファイラは、プログラムによって使用されているメモリ量と、どのオブジェクトが何を使用しているかを示します。あなたのオブジェクトのメモリ使用量を見つけることができるかもしれません。

VisualVMはJava6に含まれており、この情報を提供します。

しかし、これは必ずしもメモリ要件を提供するわけではありませんが、その時点で使用しているメモリの量を見るだけです。

関連する問題