JVM中裸java.lang.Object的实际大小

JVM中裸java.lang.Object的实际大小,java,memory-management,jvm,Java,Memory Management,Jvm,根据: 在热点: 普通对象需要8字节的“内务管理”空间 数组需要12个字节(与普通对象相同,加上数组长度的4个字节) 对象大小粒度 在Hotspot中,每个对象都占用多个字节 共8人。如果对象的标头和 字段不是8的倍数,则将其四舍五入到 八, 例如,这意味着: 一个裸对象占用8字节 带有单个布尔字段的类的实例占用16个字节:8个字节的头,1个字节的布尔值和7个字节的“填充”,使大小达到8的倍数 具有八个布尔字段的实例也将占用16个字节: 头球8个,布尔球8个;因为这已经是8的倍数,所以不需要

根据:

在热点: 普通对象需要8字节的“内务管理”空间

数组需要12个字节(与普通对象相同,加上数组长度的4个字节)

对象大小粒度 在Hotspot中,每个对象都占用多个字节 共8人。如果对象的标头和 字段不是8的倍数,则将其四舍五入到 八,

例如,这意味着:

  • 一个裸对象占用8字节
  • 带有单个布尔字段的类的实例占用16个字节:8个字节的头,1个字节的布尔值和7个字节的“填充”,使大小达到8的倍数
  • 具有八个布尔字段的实例也将占用16个字节:
    • 头球8个,布尔球8个;因为这已经是8的倍数,所以不需要填充
  • 具有两个长字段、三个整型字段和一个布尔值的对象将占用:
    • 报头为8字节
    • 2个长字节16个字节(每个8个)
    • 3个整数的12个字节(每个4个)
    • 布尔值为1字节
    • 再加上3个字节的填充,将总数从37四舍五入到40,是8的倍数
我的问题: 裸java.lang.Object没有字段。因此,
new Ojbect()
将占用堆中的8字节

但当我使用util测试
newobject()
的大小时

结果是
16
,而不是
8
。有人能告诉我为什么吗


编辑:

据我所知,在x86上,'s的大小是4字节

而且对象标题还包含同步的锁定信息

//  32 bits:
//  --------
//      hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
//      JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
//      size:32 ------------------------------------------>| (CMS free block)
//      PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)

因此对象的开销是4字节(对象头)+4字节(类指针)=8字节。

您发布的链接没有提到锁类型引用。看见除了对类(8字节)的引用外,它还将引用lock_类型。同时检查“内存使用”部分

这可能会给你更多的见解


基本上,由于64位JVM中的内存对齐和填充是8个字节,因此对象开销是16个字节:每个属性(头和类引用)占用8个字节。请参见演示文稿中的幻灯片38。但是请注意,当使用JVM选项
-XX:+UseCompressedOops

时,开销会减少到12字节。您的线路非常有用。
//  32 bits:
//  --------
//      hash:25 ------------>| age:4    biased_lock:1 lock:2 (normal object)
//      JavaThread*:23 epoch:2 age:4    biased_lock:1 lock:2 (biased object)
//      size:32 ------------------------------------------>| (CMS free block)
//      PromotedObject*:29 ---------->| promo_bits:3 ----->| (CMS promoted object)