HotSpot虚拟机java对象

HotSpot虚拟机java对象

java普通对象的创建

  • new 先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,检查这个类是否被加载,解析,初始化,没有则需要进行相应的类加载过程
  • 分配内存,类加载完成后确定的大小
  • 线程安全解决方案
    • 对分配内存空间的动作进行同步处理,实际上虚拟机是采用cas加上失败重试
    • 每个线程在堆中预先分配内存,称为本地线程分配缓冲(TLAB),缓冲区用完了,分配新缓冲区才需要同步锁定
  • 虚拟机把分配到的内存空间(不包括对象头)都初始化为0值,这一步让java实列对象字段不用付初值就能使用
  • 对对象进行必要设置,把一些信息保存到对象头中
  • 在虚拟机视角,一个新对象已经产生,但是从java程序来看,对象创建才刚开始——构造函数(Class文件中方法还没执行),所有字段都是默认的0值。

对象的内存布局

  • 对象在堆内存中的存储布局可以划分为三个部分:对象头(Header),实例数据(Instance Data),对象填充(Padding)。

对象头

  • HotSpot虚拟机对象的对象头部分包括两类信息
第一类:MarkWord

HotSpot虚拟机java对象

第二类:类型指针
  • 对象指向它的类型元数据的指针,jvm通过这个指针来确定该对象是那个类的实列。
  • 并不是所有虚拟机实现都必须在对象数据上保留类型指针,也就是查找对象元数据信息不一定要经过对象本身。
  • 如果对象是个数组,对象头还需要一个记录数组长度的数据。

对象的访问定位

  • 句柄:堆需要划分一块出来做句柄池,一块做实列池,reference储存对象句柄地址
    • 好处是对象被移动时只会改变句柄中的实列数据指针
  • 直接指针:reference中存储对象地址
    • 好处是访问速度更快
  • HotSpot主要使用直接指针访问
    HotSpot虚拟机java对象