2017-08-10 15 views
0

私は25Million Bitsetを持つBitsetのリストを持っています。 各ビットセット私が使用して作成しています:より多くのメモリを消費するビットセット

Bitset.valueOf(new long[] {1}) 

消費されているメモリは1300メガバイト程度です。つまり、平均で52バイトを占めています。 なぜ私はそんなに多くのメモリが消費されているのか理解できません。

+0

そのコードはどの言語ですか? – tadman

+0

言語はJavaです –

+0

これはもともとMemcachedというタグが付けられていたので、混乱していました。 – tadman

答えて

2

BitSetは、それ自体がオブジェクトインスタンスです(各参照はメモリを消費します)。実行するとメモリ使用量が大幅に減少するはずです

BitSet b = new BitSet(25 * 1000 * 1000); 
b.set(0, 25 * 1000 * 1000, true); 
+0

25millionビットを保存するための良い方法はありますか?基本的には、オブジェクトを固有のビットセットに関連付けたいので、メモリを節約できます。 –

+1

@ShashankVCは、コードスニペットを慎重に読んでください( 'BitSet'でJavaDocをチェックしてください)。' b'は既に2500万ビットのビットセットです。 – Thomas

1

ヒープダンプを作成して、一部のアナライザ(Eclipse MATなど)でチェックしてください。それはその記憶がどこに行くのかについてのいくつかの洞察を提供する。

ビット集合はオブジェクトであり、彼らは同様の値を含んでいるので、あなたはおそらく(私は何かを忘れてしまったが、あなたは私が何を意味するかを取得する必要賭け)以下が表示されます:

  • それぞれのBitSetのためにあなたは8を持っています(あなたが64ビットJVMを使用していると仮定して)
  • 各BitSetには、1つの要素を持つlong []配列への参照が含まれています。これは別の20バイトです(参照用に8、配列の長さフィールドには4)
  • 各BitSetにはブール値とint値が含まれています。これは別の5バイトです。

BitSetごとに33バイト(何か忘れてしまったと思います)と25.000.000 * 33バイト= 825000000バイト(または約786 MB)を要約します。

2500万ビットだけで約3MBが必要です(たとえば、その大きなビットセットを作成する場合)。

ご覧のとおり、1ビットしか含まれていないビットセットは膨大なメモリを消費します。 1つのBitSetを使用できない場合(私はその理由はわかりませんが)、2500万のブール値の配列を使う方がよいでしょう。それでも約95MBが必要です。