你真的了解Java对象吗

一、什么是Java对象

  Java对象是一类事物的抽象,有状态和行为。

二、Java对象的创建过程

2.1、Class加载

2.2、Class 链接 (验证、准备、解析)

2.3、申请对象内存

2.4、成员变量赋默认值

2.5、调用构造方法

  1、成员变量赋初始值

  2、执行构造方法语句

三、Java对象的布局、结构

4.1、普通对象

  1、对象头 markword   

  2、ClassPointer指针  (启动参数   -XX:+UserCompressedClassPointers 开启时为4字节,不开启为8字节)

  3、实例数据  (引用类型, -XX:+UserCompressedClassPointers 开启时为4字节,不开启为8字节)

  4、Padding对齐  8的倍数

4.2、数组对象

  1、对象头 markword   

  2、ClassPointer指针  (启动参数   -XX:+UserCompressedClassPointers 开启时为4字节,不开启为8字节)

  3、数组的长度

  4、实例数据  (引用类型, -XX:+UserCompressedClassPointers 开启时为4字节,不开启为8字节)

  5、Padding对齐  8的倍数

四、Java对象头的结构

  对象头包含两部分内容:

1、对象的状态信息

  对象的锁信息(2位标识当前对象锁的状态,记录锁升级后,当前对象是何种锁),hashcode信息

2、类型指针

  通过类型指针了解对象时哪个类的实例

五、对象的访问/对象的定位

1、句柄

  相较于直接指针方式,通过句柄方式访问对象的速率慢,但垃圾回收速率快

    

2、直接指针

   相较于句柄方式,通过直接指针方式访问对象的速率快,但垃圾回收速率慢

        

六、对象的大小

  针对64位,Object o = new Object(); 在内存中占用了多少字节

  1、markword   8字节

  2、UseCompressed 开启压缩    4字节, 不开启压缩 8字节

  3、实例数据   0 字节

  4、Padding对齐   8的倍数

  综上:

    开启压缩占用字节: 8 + 4  = 12  , 因为Padding对齐,  12 + 4 = 16

    不开启压缩占用字节: 8 + 8 = 16, 不需要padding对齐

  结论:

    Object o = new Object();占用16字节。

 

posted @ 2021-10-15 09:36  无虑的小猪  阅读(348)  评论(0编辑  收藏  举报