我有一个拥有25Million Bitset的Bitset列表。 每个Bitset我都可以使用:
创建Bitset.valueOf(new long[] {1})
消耗的内存大约为1300MB。 即:平均花费52bytes。 我不明白为什么要消耗这么多的内存。
答案 0 :(得分:2)
每个BitSet
本身就是一个对象实例(每个引用都占用内存)。如果你这样做,你应该会看到你的内存使用率急剧下降
BitSet b = new BitSet(25 * 1000 * 1000);
b.set(0, 25 * 1000 * 1000, true);
答案 1 :(得分:1)
创建一个heapdump并使用某个分析器(例如Eclipse MAT)进行检查。这提供了对内存去向的一些见解。
由于BitSets是对象并且它们也包含值,您可能会看到以下内容(我打赌我忘记了一些东西,但你应该明白我的意思):
总结一下,你得到每个BitSet 33个字节(我确定我忘记了一些东西)和25.000.000 * 33个字节= 825000000个字节(或大约786 MB)。
单独2500万比特需要大约3 MB(例如,如果你创建一个大的BitSet)。
正如您所看到的,只包含一位的BitSet会浪费大量内存。如果你不能使用单个BitSet(虽然我不会看到这个原因)你最好使用一个大小为2500万的布尔数组。但这仍然需要大约95MB。