Bitset消耗更多内存

时间:2017-08-10 16:43:26

标签: java bitset

我有一个拥有25Million Bitset的Bitset列表。 每个Bitset我都可以使用:

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

消耗的内存大约为1300MB。 即:平均花费52bytes。 我不明白为什么要消耗这么多的内存。

2 个答案:

答案 0 :(得分:2)

每个BitSet本身就是一个对象实例(每个引用都占用内存)。如果你这样做,你应该会看到你的内存使用率急剧下降

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

答案 1 :(得分:1)

创建一个heapdump并使用某个分析器(例如Eclipse MAT)进行检查。这提供了对内存去向的一些见解。

由于BitSets是对象并且它们也包含值,您可能会看到以下内容(我打赌我忘记了一些东西,但你应该明白我的意思):

  • 对于每个BitSet,您有一个8字节的引用(假设您使用的是64位JVM)
  • 每个BitSet包含对带有一个元素的long []数组的引用,即另外20个字节(8个用于引用,8个用于数组中的单个值,4个用于数组的长度字段)
  • 每个BitSet包含一个布尔值和一个int,这是另外5个字节。

总结一下,你得到每个BitSet 33个字节(我确定我忘记了一些东西)和25.000.000 * 33个字节= 825000000个字节(或大约786 MB)。

单独2500万比特需要大约3 MB(例如,如果你创建一个大的BitSet)。

正如您所看到的,只包含一位的BitSet会浪费大量内存。如果你不能使用单个BitSet(虽然我不会看到这个原因)你最好使用一个大小为2500万的布尔数组。但这仍然需要大约95MB。