1

如何在 C++中计算内存。new BitSet(n)

在 Java中需要什么内存。new BitSet(1024)

但似乎 Java 的公式不同。我想计算花费的内存new BitSet(100000),你能帮忙吗?

4

2 回答 2

5

BitSet 被打包成“单词”数组。一个词(在当前的实现中)很长。内部的单个位将被检索/设置使用掩码;因此,它在内部将 64 位打包在一个 long 值中,并使用一个 long 数组来保存您需要的所有位。

数组的维度将是 N (100000) / 64 字节,或 1563 个长整数,或 12504 字节,加上 BitSet 内部结构/记账所需的固定开销。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet.java的实现;计算字段并总结它们需要的空间(一个 int:4 个字节;一个 long:8 个字节,依此类推),您可以了解固定开销是多少。

于 2013-04-16T11:51:19.103 回答
2

它比 100000/8 多一点,这与 C++ 中的基本相同,假设 N 是位数。要准确测量它,您可以对其进行测试。

public static void main(String... ignored) {
    BitSet warmup = new BitSet(10000);    // load the class etc.

    long before = memoryUsed();
    BitSet bs = new BitSet(100000);
    long size = memoryUsed() - before;
    if (size == 0)
        throw new AssertionError("You need to run this with -XX:-UseTLAB for accurate accounting");
    System.out.printf("BitSet(100000) used %,d bytes%n", size);
}

public static long memoryUsed() {
    return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}

-XX:-UseTLAB在命令行上打印

BitSet(100000) used 12,544 bytes

创建了两个对象(BitSet 和 long[]),这与预期的差异很小。

于 2013-04-16T11:51:10.547 回答