我的Bitset的大小是多少? [英] What is size of my Bitset?

查看:411
本文介绍了我的Bitset的大小是多少?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



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



这是我的程序

 code> 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));
}
}

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

 位数大小:41 
Bitset长度:41
Bitset大小:64
尺寸的biset对象字节):48

问题

- 为什么 bitSet.length() bitSet.size()不同?我假设 length()是正确的吗?

- 我正在使用 memory-measurer 了解 bitSet 的大小,但它告诉我 48个字节为什么不是(41/8)byte



我很困惑

解决方案

首先,我想建议使用正确的工具分析JVM中的对象布局方案 - JOL 。在你的情况下( java -jar jol-cli / target / jol-cli.jar内部java.util.BitSet )JOL产生以下结果:

 运行64位HotSpot VM。 
使用3位移位的压缩引用。
对象是8个字节对齐。
按类型分类的字段大小:4,1,2,2,4,4,8,8 [bytes]
数组元素大小:4,1,1,2,2,4,4 ,8,8 [bytes]

java.util.BitSet对象内部:
偏移大小类型描述值
0 4(对象标题)01 00 00 00(00000001 00000000 00000000 00000000)(1)
4 4(对象头)00 00 00 00(00000000 00000000 00000000 00000000)(0)
8 4(对象头)f4 df 9f e0(11110100 11011111 10011111 11100000)( - 526393356)
12 4 int BitSet.wordsInUse 0
16 1 boolean BitSet.sizeIsSticky false
17 3(alignment / padding gap)N / A
20 4 long [] BitSet。字[0]
实例大小:24字节(由Instrumentation API报告)
空间损失:3字节内部+ 0字节外部= 3个字节总计
pre>

您的计算因为静态字段,所以不正确,因此空的 BitSet 本身保留24个字节。请注意,这些计算不是100%确切的,因为它没有考虑到 long [] 对象的大小。所以正确的结果是 java -jar jol-cli / target / jol-cli.jar externals java.util.BitSet

 运行64位HotSpot VM。 
使用3位移位的压缩引用。
对象是8个字节对齐。
按类型分类的字段大小:4,1,2,2,4,4,8,8 [bytes]
数组元素大小:4,1,1,2,2,4,4 ,8,8 [bytes]

java.util.BitSet@6b25f76bd对象外部:
地址大小类型路径值
7ae321a48 24 java.util.BitSet(object)
7ae321a60 24 [J .words [0]

这意味着一个空的 BitSet 本身使用48个字节,包括长数组。还可以在不同的VM模式下获取估计的对象布局 java -jar jol-cli / target / jol-cli.jar估计java.util.BitSet


I want to store System.currentTimeInMillis in memory with minimum space possible. because I have to store millions of them in memory.

I converted it to binaryString which gave me 41 bits

Here is my program

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));
    }
}

But when I run it I get

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

Question
- Why does bitSet.length() and bitSet.size() differ? I assume length() is correct?
- 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?

I am confused

解决方案

First of all I want to advise the right tool to analyze object layout schemes in JVMs - JOL. In your case(java -jar jol-cli/target/jol-cli.jar internals java.util.BitSet) JOL produces the following result:

Running 64-bit HotSpot VM.
Using compressed references with 3-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

java.util.BitSet object internals:
 OFFSET  SIZE    TYPE DESCRIPTION                    VALUE
      0     4         (object header)                01 00 00 00 (00000001 00000000 00000000 00000000) (1)
      4     4         (object header)                00 00 00 00 (00000000 00000000 00000000 00000000) (0)
      8     4         (object header)                f4 df 9f e0 (11110100 11011111 10011111 11100000) (-526393356)
     12     4     int BitSet.wordsInUse              0
     16     1 boolean BitSet.sizeIsSticky            false
     17     3         (alignment/padding gap)        N/A
     20     4  long[] BitSet.words                   [0]
Instance size: 24 bytes (reported by Instrumentation API)
Space losses: 3 bytes internal + 0 bytes external = 3 bytes total

Your calculations were not correct because of static fields, thus an empty BitSet itself reserves 24 bytes. Please note that these calculations are not 100% exact because it was not taken into account size of long[] object. So the right results are java -jar jol-cli/target/jol-cli.jar externals java.util.BitSet:

Running 64-bit HotSpot VM.
Using compressed references with 3-bit shift.
Objects are 8 bytes aligned.
Field sizes by type: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]
Array element sizes: 4, 1, 1, 2, 2, 4, 4, 8, 8 [bytes]

java.util.BitSet@6b25f76bd object externals:
          ADDRESS       SIZE TYPE             PATH                           VALUE
        7ae321a48         24 java.util.BitSet                                (object)
        7ae321a60         24 [J               .words                         [0]

This means an empty BitSet itself uses 48 bytes including long array. Also you can get the estimated object layout in different VM modes java -jar jol-cli/target/jol-cli.jar estimates java.util.BitSet

这篇关于我的Bitset的大小是多少?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆