这是我参与8月更文挑战的第17天,活动详情查看:8月更文挑战
对象
对像创建流程
1.遇到new 指令,会检查该类是否被加载过,如果没有,就执行类加载过程。
2.为新生对象分配内存,在类加载后便可完全确立,在堆中划分出一块内存块,将内存空间初始化为零(默认初始值)。
-
“指针碰撞”:如果堆时规整的,指针挪动内存大小的偏移量。
- 规整:由垃圾收集器是否带有空间压缩整理。所有被使用的内存放在一边,未被使用的放在另一边,中间由一个指针规定界线。
-
空闲列表:不是规整的,从列表中找到一块足够大的空间划给对象实例。
- 列表:虚拟机维护一个列表,用于记录那些内存时可用的。
-
新建内存的并发问题:一块内存分配两个对象
- 1.采用CAS+失败重试的方式保证修改的原子性。
- 2.为每个线程预先分配一块内存
3.对对象进行必要的设置,如 属于哪个类,如何找到类的元数据信息等,存放在对象的对象头中。
4.执行()方法对对象进行初始化(构造方法);
对象的内存布局
1.对象头
由两个部分组成:
- markWord :存储对象自身的运行时数据:哈希码,GC分代年龄,锁状态标志等。
- 类型指针:对象指向它的类型元数据的指针,通过它来确定是哪个类的实例。
2.实例数据
对象真正存储的有效信息:各种类型的字段内容。
对齐填充
起到占位符的作用。对象头一定时8字节的倍数,实例数据不一定是,需要通过对齐填充达到8字节的倍数。
访问定位
当创建了对象之后,如何去使用该对象
对象存放在堆中,栈种存放reference地址中,有2种访问方式
-
1.句柄访问:堆中划分出一块内存来作为句柄池,reference存放对象的句柄地址,句柄中存放对象实例数据地址(堆种)和类型数据地址(方法区中)
- 稳定:reference存放的句柄地址不会改变,当移动对象时,只改变句柄中的地址信息
-
2.直接指针:reference直接存放对象的地址信息。
- 快速:不需要经过句柄,直接访问对象。HotSpot主要使用这种方式