JVM类对象初始化(求指正)

JVM类加载过程

JVM类加载过程运行时加载一个.class文件后,会对它进行解析,并会在JVM元空间创建相应的instanceKlass对象,表示这个类的运行时的元数据,但虚拟机并不是直接用instanceKlass表示Java类,而是又在堆区创建了一个镜像类(_java_mirror),并在创建_java_mirror后再在其末尾添加了静态变量,而且二者相互引用(即都储存了对方的指针)。 同时_java_mirror是Class的实例,即obj.getClass()得到的类,其实是通过obj->_klass->_java_mirror得到的, 也就是说,直接暴露给Java使用的是_java_mirror,而不是InstanceKlass。

因此java对象的实例其实就是_java_mirror的实例

JVM对象创建过程

Java对象的表示模型叫做“OOP-Klass”二分模型,包括两部分:

  1. OOP,即Ordinary Object Point,普通对象指针,即对象的实例信息;
  2. Klass,即Java类的C++对等体,用来描述Java类,包含了元数据和方法信息等

在创建一个这个Class的Java对象的实例时,会在JVM内部相应的创建一个instanceOop来表示这个Java对象,此对象在内存中的布局分为三块区域:对象头、实例变量和填充数据。如下:

实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐。

填充数据:由于虚拟机要求对象起始地址必须是8字节的整数倍。填充数据不是必须存在的,仅仅是为了字节对齐,这点了解即可。

对象头:Hotspot虚拟机的对象头主要包括两部分数据:

  • Mark Word(_mark——标记字段)
    • Mark Word用于存储对象自身的运行时数据,它是实现轻量级锁和偏向锁的关键。
    • 内容如下:
存储内容标志位状态
对象哈希码,对象分带年龄01未锁定
指向锁记录的指针00轻量级锁定
指向重量级锁的指针10膨胀(重量级锁定)
空,不需要记录信息11GC标记
偏向线程ID,变相时间戳,对象分带年龄01可偏向
  • Klass Pointer(_metadata——元数据指针)。
    • Klass Point是是对象指向它的类的元数据(instanceKlass)的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值