JVM对象实例化

JVM对象实例化

创建对象的方式

  1. new 最常见的方法
    Xxx的静态方法 Xxxbuilder Xxxfactory的静态方法
  2. Class 的 newInstance()
    8中能用,9已经标注过时了,反射的方式,只能调用空参的构造器,权限必须是public。
  3. Constructor 的 newInstance(Xxx)
    反射的方式,可以调用空参,带参,取代了第二个
  4. 使用clone()
    不调用任何的构造器,当前的类需要实现Cloneable接口,实现clone()方法
  5. 使用反序列化
    从文件中,从网络中获取一个对象的二进制流,还原成对象。
  6. 第三方库Objenesis

创建对象的步骤

  1. 判断对象对应的类是否加载,链接,初始化
    先去metaspace的常量池中定位一个类的符号引用,检查这个类是否已被加载。
  2. 为对象分配内存
    如果堆空间内存规整,使用指针碰撞分配 。
    内存不规整,虚拟机需要维护一个列表,使用列表分配。
  3. 处理并发安全问题
    采用CAS失败重试、区域枷锁保证更新的原子性,每个线程预先分配一块TLAB,通过-XX+/-UseTLAB参数来设定。TLAB是堆空间中线程独有的区域。
  4. 初始化分配到的空间
    所有属性设置默认值,保证对象实例字段在不赋值时可以直接使用
  5. 设置对象的对象头
  6. 执行init方法进
  7. List item

行初始化
调用构造方法

对象的内存布局

  1. 对象头
    (1)运行时元数据
    哈希值,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳
    (2)类型指针
    指向了元空间中对象的具体类型
  2. 示例数据
    说明:它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的和本身拥有的字段)
    规则:
    相同宽度的字段总分配在一起
    父类中定义的变量会出现在子类之前
  3. 对其填充
    占位符的作用。

对象访问定位

对象方位两种方式:
句柄访问:优点是栈空间地址很稳定
直接指针:Hotspot采用,效率更高,更剩空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值