对象
一、类的创建
1、new 类名
2、根据new的参数在常量池中定位一个类的符号引用
3、如果没有找到这个类的符号引用,则说明这个类还没有被加载,则进行类的加载,解析和初始化
4、java虚拟机为对象分配内存(位于堆内存中)
5、将对象内存初始化为零值(不包括对象头)
6、调用对象的init方法
二、为对象分配内存
指针碰撞
空闲列表
三、线程安全性问题
线程同步(加锁):执行效率低
本地线程分配缓冲:为每个线程分配属于自己的内存区域
四、初始化对象
五、执行初始化方法
对象初始化过程详解:https://www.cnblogs.com/haoyujun135/p/11328491.html
六、对象的结构
Header(对象头)
自身运行时数据(Mark Word)
哈希值(GC分代年龄)
锁状态标志
线程持有的锁
偏向线程ID
偏向时间戳
HotSpot虚拟机对象头Mark Word
类型指针:对象指向类的源数据的指针(到对象实例数据的指针与到对象类型数据的指针)
InstanceData:HotSpot(相同宽度字段分配在一起)
Padding:填充内存的作用,(HotSpot)虚拟机要求对象所占内存必须为8位的整数倍,不满足时同步Padding进行填充
七、对象的访问定位
使用句柄:先访问句柄池,由句柄池调用堆内存(栈中访问内存统一)
直接指针:直接调用堆内存(节省性能开销)