Java内存区域对象的内存布局和访问定位(Header、Instance、Padding)

简介: Java普通对象被创建出以后,就需要关注下它在JVM堆中的内存布局是什么样子的。大致分为3个区域:1.对象头(Header)2.实例数据(Instance)3.对齐补充(Padding)1.对象头(Header)对象头在JVM这本书中有个专门的章节去讲Class文件的布局,这一章还没有去看,因此,对于这个暂时没有什么概念。

Java普通对象被创建出以后,就需要关注下它在JVM堆中的内存布局是什么样子的。

大致分为3个区域:

1.对象头(Header)

2.实例数据(Instance)

3.对齐补充(Padding)

1.对象头(Header)

对象头在JVM这本书中有个专门的章节去讲Class文件的布局,这一章还没有去看,因此,对于这个暂时没有什么概念。

主要分为2部分:

1)存储对象自身的运行时数据(Mark Word)

常见的包括hash码,GC年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时间戳等等。

具体布局我不想关注了,先知道下是什么,之后再去想为什么。

2)存储指向对象类型数据的指针

这个指针就是确定这个对象是哪个类的实例。 但是书中说这个不是必须的,需要对应对象的访问方式

存在的意义在于,栈中对象的引用使用直接指针的时候,该指针指向堆内存中的对象,所以对象头是需要存储它的类云数据指针,这个指针才是指向方法区中对象的类型 数据。

3)Java数组是特例

当是数组时还需要记录数组长度,这是因为数组对象类型的数据中没有数组长度信息。

2.实例数据(Instance)

对象存储的真正有效的数据,也就是程序代码中所定义的各种类型字段内容。包括父类继承的和子类定义的。

说下存储顺序:

1).受到JVM分配策略影响(FieldsAllocationStyle)

longs/doubles、

ints、

shorts/chars、

bytes/booleans、

oops(Ordinary Object Pointers) 差不多相同长度的被分在一块。

2).字段在Java源码中定义顺序影响

3.对齐补充(Padding)

对齐补充不是必须存在的,就是占位的作用。不去管它。

对象的访问定位

相信大家都是知道,一个对象的访问,是通过栈中的引用 访问堆中具体的地址获取到这个对象的,但是JVM并没有规定需要用何种方式去定位这个对象的具体位置。

目前主流的方式是两种:

1).句柄

2).直接指针

1).句柄

image

本质还是通过栈去访问,但是在堆中多出一块区域,存放的是句柄池,reference中存放的是对象的句柄地址,而不是真正对象的地址。句柄池内存放着对象实例数据与类型数据各自的地址,

优势: reference中存储的是稳定的句柄地址,在对象被移动(进行垃圾处理时)只改变句柄中的实例数据指针,而reference不需要修改。

2).直接指针

image

如果使用了直接地址,那么从图中也可见对象里面需要存放了类型数据的相关信息。

优势: 速度更快,省去通过句柄的另一次开销,这是常见的访问对象的方式。

目录
相关文章
|
3月前
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
401 5
|
9月前
|
监控 Java Unix
6个Java 工具,轻松分析定位 JVM 问题 !
本文介绍了如何使用 JDK 自带工具查看和分析 JVM 的运行情况。通过编写一段测试代码(启动 10 个死循环线程,分配大量内存),结合常用工具如 `jps`、`jinfo`、`jstat`、`jstack`、`jvisualvm` 和 `jcmd` 等,详细展示了 JVM 参数配置、内存使用、线程状态及 GC 情况的监控方法。同时指出了一些常见问题,例如参数设置错误导致的内存异常,并通过实例说明了如何排查和解决。最后附上了官方文档链接,方便进一步学习。
1365 4
|
5月前
|
存储 安全 Java
java: 无法访问org.springframework.ldap.core.LdapTemplate
java: 无法访问org.springframework.ldap.core.LdapTemplate
170 9
|
6月前
|
Arthas 监控 Java
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
Java死锁 如何定位?如何避免Java死锁?(图解+秒懂+史上最全)
|
7月前
|
缓存 Java 数据库
Java 访问修饰符使用方法与组件封装方法详细说明
本文详细介绍了Java中访问修饰符(`public`、`private`、`protected`、默认)的使用方法,并结合代码示例讲解了组件封装的核心思想与实现技巧。内容涵盖数据封装、继承扩展、模块化设计与接口隔离等关键技术点,帮助开发者提升代码的可维护性与安全性,适用于Java初学者及进阶开发者学习参考。
165 1
|
8月前
|
搜索推荐 Java 定位技术
Java实现利用GeoLite2-City.mmdb根据IP定位城市的方法
在城市,国家,地区等地理位置数据获取之后,你可以依指定的业务需求,来进行进一步的数据处理。例如,你可以设计一个应用,根据用户的 IP 地址来个性化地展示内容,或者用于分析网络请求的来源等。
1549 20
|
10月前
|
存储 Java
课时4:对象内存分析
接下来对对象实例化操作展开初步分析。在整个课程学习中,对象使用环节往往是最棘手的问题所在。
|
10月前
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
139 0
Java对象创建和访问
|
12月前
|
NoSQL JavaScript 前端开发
Java访问MongoDB
Java访问MongoDB
189 21
|
6月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
2097 0