你真的了解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字节。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)