scr*_*avy 14 java memory primitive jvm-hotspot
如何大,以字节为单位,是一个盒装的原始状java.lang.Integer或java.lang.CharacterJava中?
An int是4个字节,典型的指针也是4个字节(如果没有被JVM压缩).那么整数(没有缓存)的成本是4 bytes + 4 bytes = 8 bytes多少?盒子对象中是否还有任何隐藏字段或者对象产生的额外开销(即,我不知道对象的一般成本?).
我对缓存问题不感兴趣.我知道JVM会缓存某个范围内的整数.
可以重新解释这个问题:用于盒装值与原始值的内存量相乘的最大因子是多少?
编辑:我明白存在JVM的多个实现.典型的32位HotSpot实现的典型成本是多少?
这是实现定义的,所以没有具体的答案.但我应该能够为Hotspot回答它.
您需要知道的是:Hotspot始终在8字节边界上对齐对象.此外,每个对象有2个字开销.[1]
如果我们把它放在一起,我们得到:
32位VM:4字节整数+ 2字对象标题= 12字节.这不是8的倍数,因此1个整数的成本是8:16byte的下一个倍数.
64位VM:4字节整数+ 2字= 20字节.再次向上舍入:24字节大小.
引用的大小显然不会影响对象本身的大小,除非它引用了其他对象,而不是简单的int包装器.如果是这样的话,CompressedOops对于64位JVM,对于32位而言,我们的每个引用都有4字节,对于堆<= 32gb,我们有4byte的现代JVM(否则为8byte).
[1]感兴趣的人可以查看代码 share/vm/oops/oop.hpp
| 归档时间: |
|
| 查看次数: |
2959 次 |
| 最近记录: |