【JVM学习】Java内存管理二

1 对象的创建过程

当执行字节码new指令时,首先会判断目标类是否已经进行过类加载,没有则会先执行一次类加载。执行完毕后,jvm会为新生对象分配内存,并将分配到的内存空间都初始化为零值(eg. int为0,boolean为false)。

然后设置对象头的相关信息,例如对象的元数据即class信息、对象的GC分代年龄、锁标识等。

最后执行Class的<init>()方法,也就是构造方法。

至此,对象完全创建完成。

2 对象的内存布局

对象在内存中的布局可分为三个部分对象头、实例数据、对齐填充

2.1 对象头

对象头分为两部分:Mark Word类型指针 以及数组对象特有的信息:数组长度。

Mark Word:对象自身的运行时数据,如哈希码、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID等,这部分数据的长度在32位和64位虚拟机中分别为32bit和64bit,官方称之为“Mark Word”。

类型指针:即指向对象类型元数据的指针,也就是class对象;jvm可以通过它来确对象是哪个类的实例。

2.2 实例数据

实例数据存储的是对象真正的有效信息,也就是我们在代码中定义的成员属性,无论是从父类继承的,还是在子类定义的,都会在这里记录。

2.3 对齐填充

这块数据并不是必然存在的,也没有特别的含义,它仅仅是占位符的作用。由于HotSpot虚拟机的自动内存管理系统要求对象其实地址必须是8字节的整数倍,也就是说任何对象的大小都必须说8字节的整数倍。如果对象的实例数据部分没有对齐的话,就需要通过“对齐填充”部分来补全。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值