Java 32位系统BitSets的内存大小

时间:2013-04-16 11:32:16

标签: java memory bitset

如何在C ++中使用compute the memory of new BitSet(n)

Java中的memory takes the new BitSet(1024)

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

2 个答案:

答案 0 :(得分:5)

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

数组的维数为N(100000)/ 64字节,或1563长,或12504字节,加上BitSet为其内部结构/ bookeeping所需的固定开销。

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

答案 1 :(得分: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 []),它们与预期的差异很小。