我的Bitset的大小是多少? [英] What is size of my 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。
pre>
使用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个字节总计
您的计算因为静态字段,所以不正确,因此空的
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 me41 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 doesbitSet.length()
andbitSet.size()
differ? I assumelength()
is correct?
- I am using memory-measurer to learn about the size ofbitSet
, but it tell me48 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 oflong[]
object. So the right results arejava -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 modesjava -jar jol-cli/target/jol-cli.jar estimates java.util.BitSet
这篇关于我的Bitset的大小是多少?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!