gpt4 book ai didi

java - 我的 Bitset 的大小是多少?

转载 作者:IT王子 更新时间:2023-10-28 23:37:24 24 4
gpt4 key购买 nike

我想以尽可能小的空间将 System.currentTimeInMillis 存储在内存中。因为我必须在内存中存储数百万个。

我将它转换为 binaryString 这给了我 41 位

这是我的程序

public class BitSetSize {
public static void main(final String[] args) {
final long currentTimeMillis = System.currentTimeMillis();
final String currentTimeToBinaryString = Long.toBinaryString(currentTimeMillis);
System.out.println("Size in bits: " + currentTimeToBinaryString.length());

final BitSet bitSet = BitSet.valueOf(new long[]{currentTimeMillis});
System.out.println("Bitset length: " + bitSet.length());
System.out.println("Bitset size: " + bitSet.size());

System.out.println("Size of biset object(bytes): " + MemoryMeasurer.measureBytes(bitSet));
}
}

但是当我运行它时,我得到了

Size in bits: 41
Bitset length: 41
Bitset size: 64
Size of biset object(bytes): 48

问题
- 为什么 bitSet.length()bitSet.size() 不同?我假设 length() 是正确的?
- 我正在使用 memory-measurer想了解bitSet的大小,却告诉我48 bytes,为什么不是(41/8) byte

我很困惑

最佳答案

Why does bitSet.length() and bitSet.size() differ? I assume length() is correct?

BitSet.size()是它用来存储位值的内部数据结构的大小。由于 BitSet 在内部使用 long[] 数组,因此大小始终是 64 位的倍数。例如。如果您在 BitSet 中设置第 64 位,则 BitSet 必须增加 long[] 数组的容量才能存储该值,因为每个 long 可以“仅”存储 64 位。例如

BitSet bitSet = new BitSet();
for (int i = 0; i <= 64; i++) {
bitSet.set(i, true);
System.out.println(bitSet.size());
}

BitSet.length() 返回BitSet 中实际占用的位。因此,如果您创建一个新的 BitSet,它的长度为 0。如果您随后设置第 4 位,则长度将为 5。 size 将保持 64,因为只有一个 long 是需要存储 5 位。

BitSet bitSet = new BitSet();
System.out.println(bitSet.length()); // 0
bitSet.set(4, true);
System.out.println(bitSet.size()); // 64
System.out.println(bitSet.length()); // 5

I am using memory-measurer to learn about the size of bitSet, but it tell me 48 bytes, why is it not (41/8) byte?

因为内存填充。也称为 data structure alignment .BitSet 对象在内存中需要 41 个数学字节。

  • 对象头 8 个字节
  • long[]
  • 为 20 字节
  • 数组中的 long 为 8 个字节
  • wordsInUse int 变量为 4 个字节
  • sizeIsSticky 1 个字节 boolean

但 jvm 无法分配 41 位,因此它会将其四舍五入为 8 的下一个倍数。即 48。

此大小可能会有所不同,因为对象 header 大小可能会因不同的 JVM 实现而异。所以如果对象头是16个字节。总数为 49,jvm 将其四舍五入为 8 的下一个倍数。在本例中为 56。

关于java - 我的 Bitset 的大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33251379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com