Java对象(创建过程、内存布局、访问方法)
(Java 普通对象。不包括数组、Class 对象等。) ? 对象创建过程类加载遇到 new 指令时,获取对应的符号引用,并检查该符号引用代表的类是否已被初始化。如果没有就进行类加载。 分配内存从堆中找到一块空间划分给对象。 分配时,为了避免并发问题,JVM 会通过 CAS + TLAB 来保证线程安全。 TLAB 本地线程分配缓冲每个线程都会在堆中预先分配一小块内存,这块空间叫做 TLAB。 线程每次给对象分配内存,就从它的 TLAB 中划分。用完会再给线程分配新的 TLAB。 只有分配 TLAB 时才需要同步锁定。 设置零值设置实例字段的数据类型所对应的零值。 设置对象头信息对象的哈希码、GC 分代年龄等。 执行 init 方法new 指令后会有 invokespecial 指令,它会执行类的 该方法是编译期由构造代码块+构造方法来生成的。 ? 对象结构Hotspot 中对象在内存中的布局分为三个部分: 对象头Mark Word对象运行时数据,如哈希码、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等。 类型指针指向方法区里的类元数据。用来确定该对象是哪个类的。 实例数据程序中定义的各字段。包括从父类继承的。 对齐填充Hotspot 要求对象起始地址必须是 8 字节的整数倍,所以没有对齐时需要对齐填充。 ? 如何访问对象、判断类型JVM 规范中只规定了栈上的 reference 类型是指向对象的引用,并没有规定 JVM 该如何根据这个引用进行定位、访问堆中的对象。 Hotspot 中 reference 是直接存储了对象的地址。而获取对象类型信息,就根据对象头的类型指针来访问获取。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |