首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JVM中裸java.lang.Object的实际大小

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

Stack Overflow用户
提问于 2014-01-28 04:54:43
回答 2查看 2.6K关注 0票数 3

根据Java对象的内存使用:一般指南的说法:

热点:

一个普通对象需要8个字节的“内务”空间; 数组需要12个字节(与普通对象相同,加上数组长度为4个字节)。

对象粒度

在Hotspot中,每个对象占用的字节数是8的倍数。如果对象对其标头和字段所需的字节数不是8的倍数,那么您可以将下一个字节数为8。 例如,这意味着:

  • 裸对象占用8个字节;
  • 一个具有单个布尔字段的类的实例占用16个字节:8字节的头,1字节的布尔值,7字节的“填充”,使其大小达到8的倍数;
  • 一个包含8个布尔字段的实例也将占用16个字节:
    • 头8,布尔8;因为这已经是8的倍数,所以不需要填充;

  • 具有两个长字段、三个int字段和一个布尔值的对象将占用:
    • 头的8个字节;
    • 两个长的16字节(每个8字节);
    • 3个ints的12个字节(每个4字节);
    • 布尔值为1字节;
    • 再加上3个字节的填充,使总数从37增加到40,倍数为8。

我的问题是:

裸露的java.lang.Object没有字段。因此,new Ojbect()在堆中将占用8个字节。

但是当我使用new Object() util测试仪表代理的大小时。

代码语言:javascript
复制
System.out.println(MemoryUtil.deepMemoryUsageOf(new Object()));

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

编辑:

据我所知,对象标头的大小在x86上是4字节。

此外,对象标头还包含用于同步的锁信息。

代码语言:javascript
复制
//  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字节。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-28 11:17:51

这个有趣的陈述可能会给你更多的见解。

基本上,由于64位JVM中的内存对齐和填充为8字节,对象开销为16字节:每个属性(标头和类引用)需要8个字节。参见演示文稿中的幻灯片38。注但是,当使用JVM选项-XX:+UseCompressedOops时,开销将减少到12个字节。

票数 2
EN

Stack Overflow用户

发布于 2014-01-28 05:49:48

您发布的链接没有提到lock_type引用。见。除了对类的引用(8个字节)外,它还将引用lock_type。还可以检查“内存使用”部分这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21397125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档