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

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

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

目录
相关文章
|
10天前
|
存储 缓存 Java
java线程内存模型底层实现原理
java线程内存模型底层实现原理
java线程内存模型底层实现原理
|
12天前
|
存储 Java 关系型数据库
java: 无法访问org.springframework.context.ConfigurableApplicationContext
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
29 11
|
10天前
|
安全 Java 编译器
java访问字段
java访问字段
19 6
|
8天前
|
安全 Java 编译器
java访问类字段
java访问类字段
|
6天前
|
存储 算法 Java
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
本文介绍了 JVM 的内存区域划分、类加载过程及垃圾回收机制。内存区域包括程序计数器、堆、栈和元数据区,每个区域存储不同类型的数据。类加载过程涉及加载、验证、准备、解析和初始化五个步骤。垃圾回收机制主要在堆内存进行,通过可达性分析识别垃圾对象,并采用标记-清除、复制和标记-整理等算法进行回收。此外,还介绍了 CMS 和 G1 等垃圾回收器的特点。
18 0
深入解析 Java 虚拟机:内存区域、类加载与垃圾回收机制
|
7天前
|
安全 Java 开发者
Java修饰符与封装:理解访问权限、行为控制与数据隐藏的重要性
Java中的修饰符和封装概念是构建健壯、易维护和扩展的Java应用程序的基石。通过合理利用访问权限修饰符和非访问修饰符,开发者能够设计出更加安全、灵活且高效的代码结构。封装不仅是面向对象编程的核心原则之一,也是提高软件项目质量和可维护性的关键策略。
10 1
|
12天前
|
Java 编译器
深入理解Java内存模型:从基础到高级
本文旨在通过通俗易懂的方式,引导读者深入理解Java内存模型(JMM)的核心概念和工作原理。我们将从简单的基础知识入手,逐步探讨重排序、顺序一致性问题以及volatile关键字的实现机制等高级主题。希望通过这篇文章,你能够对Java内存模型有一个清晰、全面的认识,并在实际编程中有效地避免并发问题。
|
10天前
|
存储 算法 Java
深入理解Java内存管理
本文将通过通俗易懂的语言,详细解析Java的内存管理机制。从JVM的内存结构入手,探讨堆、栈、方法区等区域的具体作用和原理。进一步分析垃圾回收机制及其调优方法,最后讨论内存泄漏的常见场景及防范措施。希望通过这篇文章,帮助读者更好地理解和优化Java应用的内存使用。
|
11天前
|
存储 Java 关系型数据库
java: 无法访问org.springframework.ldap.core.LdapTemplate
`亲测可用,之前搜索了很多博客,啥样的都有,就是不介绍报错以及配置用处,根本不懂照抄那些配置是干啥的,稀里糊涂的按照博客搭完也跑不起来,因此记录这个。` `项目背景`:公司项目当前采用http协议+shiro+mysql的登录认证方式,而现在想支持ldap协议认证登录然后能够访问自己公司的项目网站。 `举例说明`:假设我们公司有自己的门户网站,现在我们收购了一家公司,他们数据库采用ldap存储用户数据,那么为了他们账户能登陆我们公司项目所以需要集成,而不是再把他们的账户重新在mysql再创建一遍,万一人家有1W个账户呢,不累死了且也不现实啊。
12 1
|
2月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。

热门文章

最新文章

下一篇
无影云桌面