Java对象(创建过程、内存布局、访问方法)

(Java 普通对象。不包括数组、Class 对象等。)

对象创建过程

类加载

遇到 new 指令时,获取对应的符号引用,并检查该符号引用代表的类是否已被初始化。如果没有就进行类加载。

分配内存

从堆中找到一块空间划分给对象。

分配时,为了避免并发问题,JVM 会通过 CAS + TLAB 来保证线程安全。

TLAB 本地线程分配缓冲

每个线程都会在堆中预先分配一小块内存,这块空间叫做 TLAB。

线程每次给对象分配内存,就从它的 TLAB 中划分。用完会再给线程分配新的 TLAB。

只有分配 TLAB 时才需要同步锁定。

设置零值

设置实例字段的数据类型所对应的零值。

设置对象头信息

对象的哈希码、GC 分代年龄等。

执行 init 方法

new 指令后会有 invokespecial 指令,它会执行类的 <init> 方法。

该方法是编译期由构造代码块+构造方法来生成的。

对象结构

Hotspot 中对象在内存中的布局分为三个部分:

对象头

Mark Word

对象运行时数据,如哈希码、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。

类型指针

指向方法区里的类元数据。用来确定该对象是哪个类的。

实例数据

程序中定义的各字段。包括从父类继承的。

对齐填充

Hotspot 要求对象起始地址必须是 8 字节的整数倍,所以没有对齐时需要对齐填充。

如何访问对象、判断类型

JVM 规范中只规定了栈上的 reference 类型是指向对象的引用,并没有规定 JVM 该如何根据这个引用进行定位、访问堆中的对象。

Hotspot 中 reference 是直接存储了对象的地址。而获取对象类型信息,就根据对象头的类型指针来访问获取。

转载于:https://www.cnblogs.com/eycuii/p/11477849.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值