Java 位集占用更多内存

Java 位集占用更多内存,java,bitset,Java,Bitset,我有一个有2500万位集的位集列表。 我使用以下方法创建的每个位集: Bitset.valueOf(new long[] {1}) 消耗的内存约为1300MB。 Ie:平均需要52字节。 我不明白为什么要消耗这么多的内存 每个位集本身就是一个对象实例(每个引用占用内存)。如果您这样做,您应该会看到内存使用率大幅下降 BitSet b = new BitSet(25 * 1000 * 1000); b.set(0, 25 * 1000 * 1000, true); 每个位集本身就是一个对象实例

我有一个有2500万位集的位集列表。 我使用以下方法创建的每个位集:

Bitset.valueOf(new long[] {1})
消耗的内存约为1300MB。 Ie:平均需要52字节。
我不明白为什么要消耗这么多的内存

每个
位集本身就是一个对象实例(每个引用占用内存)。如果您这样做,您应该会看到内存使用率大幅下降

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

每个
位集本身就是一个对象实例(每个引用占用内存)。如果您这样做,您应该会看到内存使用率大幅下降

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

创建一个heapdump并使用一些分析器(例如eclipsemat)检查它。这提供了一些关于内存去向的见解

由于位集是对象,并且它们也包含值,您可能会看到以下内容(我打赌我忘了什么,但您应该明白我的意思):

  • 对于每个位集,您都有一个8字节的引用(假设您使用的是64位JVM)
  • 每个位集包含一个对长[]数组的引用,该数组包含一个元素,即另一个20字节(8表示引用,8表示数组中的单个值,4表示数组的长度字段)
  • 每个位集包含一个布尔值和一个整数,即另外5个字节
总的来说,每个比特集有33个字节(我肯定我忘了什么),25.000.000*33字节=825000000字节(或者大约786MB)

仅2500万位就需要大约3MB(例如,如果您要创建一个如此大的位集)


如您所见,仅包含一位的位集是对内存的巨大浪费。如果不能使用单个位集(尽管我看不出原因),那么最好使用2500万大小的布尔数组。但这仍然需要大约95MB。

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

由于位集是对象,并且它们也包含值,您可能会看到以下内容(我打赌我忘了什么,但您应该明白我的意思):

  • 对于每个位集,您都有一个8字节的引用(假设您使用的是64位JVM)
  • 每个位集包含一个对长[]数组的引用,该数组包含一个元素,即另一个20字节(8表示引用,8表示数组中的单个值,4表示数组的长度字段)
  • 每个位集包含一个布尔值和一个整数,即另外5个字节
总的来说,每个比特集有33个字节(我肯定我忘了什么),25.000.000*33字节=825000000字节(或者大约786MB)

仅2500万位就需要大约3MB(例如,如果您要创建一个如此大的位集)


如您所见,仅包含一位的位集是对内存的巨大浪费。如果不能使用单个位集(尽管我看不出原因),那么最好使用2500万大小的布尔数组。这仍然需要大约95MB。

这段代码是什么语言的?语言是Java这段代码最初被标记为Memcached,所以很混乱。这段代码是什么语言的?语言是Java这段代码最初被标记为Memcached,所以很混乱。有没有更好的方法来存储2500万位?基本上,我想将一个对象与一组唯一的位关联起来,这样可以节省内存。@ShashankVC仔细阅读代码片段(并检查
BitSet
上的JavaDoc):
b
已经是2500万位的位集了。有没有更好的方法来存储2500万位?基本上,我想将一个对象与一组唯一的位相关联,这样可以节省内存。@ShashankVC仔细阅读代码片段(并检查
BitSet
上的JavaDoc):
b
已经是2500万位的位集了。