【8】Java对象的内存布局

创建对象的几种方式:

  • new语句(调用构造器来初始化实例字段)
  • 反射机制(调用构造器来初始化实例字段)
  • Object.clone方法(复制已有的数据,来初始化新建对象的实例字段)
  • 反序列化(复制已有的数据,来初始化新建对象的实例字段)
  • Unsafe.allocateInstance(不进行实例字段初始化)

构造函数的调用:
构造函数的调用要做为构造器的低一条语句,目的是初始化继承而来的父类字段

  • 隐式调用:父类存在无参构造函数,子类隐式调用父类构造器
  • 显示调用:
    1. 父类不存在无参构造函数,子类显式调用父类构造器(super)
    2. 调用同类其他构造函数(this)

压缩指针

JVM引入了压缩指针的概念,将原本的64位指针压缩为32位。
64位JVM中,一个Java对象在内存中的额外开销是16字节(对象头标记字段64位,类型指针64位)
eg Integer类型,它仅有一个int类型的私有字段,占4个字节,该类对象的额外内存开销是真正内存开销的4倍(这也是为啥Java引入基本类型的原因之一)

64为JVM通过引入压缩指针来进行对象指针的压缩(64位压缩为32位,对象头大小从16字节降至12字节(类型指针被压缩为32位,对象头标记字段仍然是64位))

字段重排列

概念:JVM重新分配字段的先后顺序,以达到内存对齐的目的

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值