Java 32位系统位集的内存大小 如何在C++中使用< /P>

Java 32位系统位集的内存大小 如何在C++中使用< /P>,java,memory,bitset,Java,Memory,Bitset,什么是Java 但Java的公式似乎不同。我想计算新比特集(100000)< /> >的内存,请帮助? 它比C++中的100000/8个基本上相同,假设n是位的数目。为了精确地测量它,你可以测试它 public static void main(String... ignored) { BitSet warmup = new BitSet(10000); // load the class etc. long before = memoryUsed(); BitS

什么是Java


但Java的公式似乎不同。我想计算<代码>新比特集(100000)< /> >的内存,请帮助?

它比C++中的100000/8个基本上相同,假设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

创建了两个对象(位集和长[]),它们与预期的小差异。

< P>它比C++中的100000/8个基本上相同,假设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

创建的两个对象(位集和long[])与预期的差异很小。

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

数组的维数为N(100000)/64字节,或1563个长字节,或12504个字节,加上位集内部结构/簿记所需的固定开销


执行情况见;对字段进行计数并对它们所需的空间进行求和(int:4字节;long:8字节,等等),您可以了解固定开销是多少。

位集被打包到“字”数组中。字(在当前实现中)是长的。内部的单个位将使用掩蔽进行检索/设置;因此,它将64位内部打包到一个长值中,并使用一个长数组来保存您需要的所有位

数组的维数为N(100000)/64字节,或1563个长字节,或12504个字节,加上位集内部结构/簿记所需的固定开销



执行情况见;对字段进行计数并对它们所需的空间进行求和(int:4字节;long:8字节,等等),您可以了解固定开销是多少。

100000/1024
乘以
新位集(1024)
使用多少?是的,但这是相对的方式,我希望根据分配的位数得到一个精确的公式。通常,100000/8+一些开销。您可以使用提供的示例代码。但是让我们假设1024位是128字节,因此可以假设类的其余部分有40字节的开销。所以(100000/8+40)=>12540字节应该是答案。请参见以下内容:[BitSet.size()…][1][1]:如果我理解正确,这就是您要查找的内容。
100000/1024
乘以
新的位集(1024)
使用的字节数?是的,但这是相对的方式,我希望根据分配的位数得到一个精确的公式。通常,100000/8+一些开销。您可以使用提供的示例代码。但是让我们假设1024位是128字节,因此可以假设类的其余部分有40字节的开销。因此,(100000/8+40)=>12540字节应该是答案。请参见以下内容:[BitSet.size()…][1][1]:如果我理解正确,这就是您要查找的内容。…+1用于实际测试它的代码,以及
-XX:-UseTLAB
cmd行选项!它降低了多线程性能,因为它使内存池成为单线程,但为字节精确的内存计算提供了+1,以便代码实际测试它,并且为
-XX:-UseTLAB
cmd行选项提供了+1!它降低了多线程性能,因为它使内存池成为单线程的,但提供了字节精确的内存计算。您无法确保所有Java虚拟机都使用这样的数据结构实现位集类。其他实现可能会使用更多或更少的内存。没错,更具体地说,对于一个特定的JDK/SDK:例如,Android可以使用不同的实现,JDK7或8也可以使用不同的实现(即使它不太可能,因为1.0-6使用了我链接的实现),基本正确,但在许多情况下,这是特定JavaVM的实现细节。您无法确保所有Java虚拟机都使用这样的数据结构实现位集类。其他实现可能会使用更多或更少的内存。确实,更具体地说,对于特定的JDK/SDK:例如,Android可以使用不同的实现,JDK7或8也可以使用不同的实现(即使这不太可能,因为1.0-6使用了我链接的实现)