对象的实例化
1.创建对象的几种方式
创建对象
1.new 方式;
XxxBuilder/XxxFactory的静态方法;
2.Class的newInstance():
反射的方式,只能调用空参的构造器,权限必须是public;
JDK9中已经废弃;
3.Constructor的newInstance(Xxx):
反射的方式,可以调用空参、带参的构造器,权限没有要求;
JDK9后替代Class的newInstance()
4.使用clone():浅复制
不调用任何构造器,当前类需要实现Cloneable接口,实现clone()
6.第三方库Objenesis;使用字节码创建对象
2.创建对象的步骤
1.判断对象对应的类是否加载、链接、初始化
2.为对象分配内存
若内存规整:指针碰撞-- 标记整理算法
空闲列表分配
3.处理并发安全问题
4.初始化分配到的空间
所有属性设置初始化值,保证对象实例字段在不赋值时可以直接使用;
5.设置对象的对象头;
6.执行init方法间初始化;
调用类的构造器
new相当于创建对象,但未初始化;执行完初始化后,属性就会赋值上默认值;
3.对象内存布局
对象头:两部分运行时元数据、类型指针;
运行时元数据:哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳
主线程的VMS(虚拟机栈):
局部变量表:参数args,变量cust;(因为是静态函数所以没有this,非静态函数要有this)
局部变量表cust执行堆空间的对象头(运行时元数据、类型指针);
类型指针指向方法区的类元信息(元空间);
字符串常量池:放在堆空间中;
4.对象访问定位
对象访问方式主要两种:句柄访问、直接指针(Hotspot采用)
句柄访问
指针直接引用
句柄访问和指针直接引用对比
句柄访问需要单独开辟句柄池;访问时先在句柄池中找到句柄,然后再通过句柄在实例池中找到对象实例;
而指针直接引用无需开辟额外空间,可直接指向找到方法区中的对象类型数据;
句柄访问的优点:
大厂面试题:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。