JVM程序员

HotSPot虚拟机对象探秘

2017-12-19  本文已影响21人  紫霞等了至尊宝五百年

1 对象的创建过程

当虚拟机遇到一条含有new的指令时,会进行一系列对象创建的操作

  1. 检查常量池中是否有要创建的这个对象所属类的符号引用
  1. 检查这个符号引用所代表的类是否已被JVM加载
  1. 根据方法区中该类的信息确定该类所需的内存大小
    一个对象所需的内存大小是在这个对象所属类被定义完就能确定的!
    且一个类所生产的所有对象的内存大小是一样的!
    JVM在一个类被加载进方法区的时候就知道该类生产的每一个对象所需要的内存大小
    从堆中划分一块对应大小的内存空间给新的对象,分配堆中内存有两种方式

综上所述:JVM究竟采用哪种内存分配方法,取决于它使用了何种GC器
为对象中的成员变量赋上初始值(默认初始化)

  1. 设置对象头(Object Header)
  2. 调用对象的构造函数进行初始化

至此,整个对象的创建过程就完成了

2 对象的内存布局

一个对象从逻辑角度看,由域和方法构成
从物理角度来看,对象是存储在堆中的一串二进制数

对象在内存中存储的布局分三部分

2.1 对象头

2.2 实例数据

实例数据部分就是程序定义的各种字段的内容,包含父/子类的都会记录下来

2.3 对齐填充(并非必然存在,无特别含义,仅起占位符作用)

HotSpot要求对象的大小必须是8字节的整数倍
由于对象起始地址必须是8字节的整数倍,但实例数据部分的长度是任意的,因此需要对齐补充字段确保整个对象的总长度为8的整数倍

3 访问对象的过程

栈上的reference数据存放的是一个地址,那么根据地址类型的不同,对象有不同的访问方式

上一篇下一篇

猜你喜欢

热点阅读