对象的实例化
创建对象的方式
- new
- clone
- 反序列化
- 通过文件或者网络获取对象的二进制流
- class的newinstance
- 反射的方式,只能调用空参
- constructor的newinsurance
- 反射的方式,能调用空参或有参
- 其它第三方库
对象创建的步骤
- 对应类是否加载、链接、初始化
- 为对象分配内存
- 计算对象所需空间
- 如果内存规整则通过指针碰撞方式进行划定内存,移动指针
- 如果内存不规整则维护空闲列表,从中找到足够大的一块使用
- 处理并发安全问题
- cas乐观锁
- TLAB方式
- 属性初始化(根据代码设置初始化值)
- 设置对象头
- 执行init方法(编译时字节码文件生成的针对属性和代码块的初始化方法)
对象的内存布局
- 对象头
- 运行时元数据(8字节):哈希值,锁标志位,gc分代年龄,线程持有的锁,偏向锁线程id,偏向时间戳
- 类型指针(4字节):指向类元数据
- 数组长度(4字节):如果是数组时才有
- 实例数据
- 存储本身字段和父类字段
- 相同字段放在一起,父类字段放在前
- 子类的窄变量可以插入到父类变量空隙(可以参数控制)
- 对齐填充(保证可以被8字节整除)
对象的访问定位
通过栈桢中记录的对象引用地址来访问对象,具体有两种方式
- 句柄访问:堆中有句柄池分别记录指向对象的指针以及指向类型的指针
- 优点:对象移动时不需要修改栈桢中的地址
- 缺点:单独维护句柄池
- 直接访问:栈帧中的地址指向堆中对象,对象中记录类型指针
- 优点:不需要额外的空间
- 缺点:对象移动时需要修改地址
版权声明:本文为博主原创文章,欢迎转载,转载请注明作者、原文超链接,感谢各位看官!!!
本文出自:monkeyGeek
座右铭:生于忧患,死于安乐
欢迎志同道合的朋友一起交流、探讨!
