JVM对象实例化

    技术2024-08-07  69

    JVM对象实例化

    创建对象的方式

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

    创建对象的步骤

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

    行初始化 调用构造方法

    对象的内存布局

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

    对象访问定位

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

    Processed: 0.020, SQL: 9