HotSpot虚拟机对象

1.对象的创建过程

Java是一门面向对象的编程语言,在Java程序运行的过程中无时无刻不在创建出新的对象;在语言的层面,创建对象仅仅就是new关键字而已,

在虚拟机中对象(讨论不包括数组对象和Class对象)的创建又是怎样的一个过程?

1.1 类加载过程

当虚拟机收到New指令,就会检查这条指令的参数能否在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析初始化过,如果没有就必须执行响应的类加载过程。

1.2为新生对象分配内存

对象所需要的内存在类加载弯沉之后便可以完全确定,为新生对象分配内存其实就是把一块已知大小的内存从Java堆中划分出来;

根据Java堆的内存是否规整,内存分配时可以选择“指针碰撞”和“空闲列表”,而Java堆内存是否规整取决于所采用的垃圾收集器是否具有压缩整理功能。

1.3 线程安全性

对象的创建时非常频繁的行为,虽然仅仅只是修改一个指针所指向的位置,但是在并发的情况下,也不是线程安全的。

1.3.1分配的内存空间的动作进行同步处理

1.3.2 将内存分配的动作按照线程划分到不同的内存中执行

每一个线程预先在Java堆中预先分配一块小内存,称为本地线程分配缓冲(TLAB),那个线程需要分配内存就在自己的TLAB上分配,只有TLAB用完并且分配新的TLAB时,才需要同步锁定。

1.4 虚拟机将分配到内存初始化为0(不包括对象头)

1.5 需要对对象进行必要的设置

这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象G分代年龄信息等

这些信息都放在对象头之中。

1.6方法执行

把对象按照程序员的意愿初始化,这样一个真正可用的对象才算产生出来。

2.对象的布局

在HotSpot中对象在内存中的存储布局方为:对象头、实例数据、对其填充。

2.1 对象头

对象头包含两部分信息

2.1.1 存储对象自身运行时数据


2.1.2 类型指针

对象指向它的类元数据的指针,对象通过这个指针找到对象是哪一个类的实例,但是并不是所有的虚拟机实现都在对象数据上保留类型指针。

2.2 实例数据

真正存储的有效信息,也是在程序中定义的各种类型的字段内容,无论是从父类继承下来的还是子类自身定义的都需要记录下来。

2.3对齐填充

这部分不是必然存在的,也没有特别的作用,也就是占位符的作用。由于HotSpot要求对象的其实地址必须是8字节的整数倍,换句话说也就是对象的内存大小必须是8字节的整数倍,对象头刚好是8字节的整数倍(1倍或者2倍),当实例数据部分不满足8字节的整数倍时,就需要进行对齐填充来补全。

3.对象访问定位

3.1使用句柄


3.2直接指针访问


你可能感兴趣的:(HotSpot虚拟机对象)