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

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

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

目录
相关文章
|
12天前
|
缓存 easyexcel Java
Java EasyExcel 导出报内存溢出如何解决
大家好,我是V哥。使用EasyExcel进行大数据量导出时容易导致内存溢出,特别是在导出百万级别的数据时。以下是V哥整理的解决该问题的一些常见方法,包括分批写入、设置合适的JVM内存、减少数据对象的复杂性、关闭自动列宽设置、使用Stream导出以及选择合适的数据导出工具。此外,还介绍了使用Apache POI的SXSSFWorkbook实现百万级别数据量的导出案例,帮助大家更好地应对大数据导出的挑战。欢迎一起讨论!
106 1
|
1天前
|
存储 Java 编译器
Java内存模型(JMM)深度解析####
本文深入探讨了Java内存模型(JMM)的工作原理,旨在帮助开发者理解多线程环境下并发编程的挑战与解决方案。通过剖析JVM如何管理线程间的数据可见性、原子性和有序性问题,本文将揭示synchronized关键字背后的机制,并介绍volatile关键字和final关键字在保证变量同步与不可变性方面的作用。同时,文章还将讨论现代Java并发工具类如java.util.concurrent包中的核心组件,以及它们如何简化高效并发程序的设计。无论你是初学者还是有经验的开发者,本文都将为你提供宝贵的见解,助你在Java并发编程领域更进一步。 ####
|
1天前
|
存储 安全 Java
什么是 Java 的内存模型?
Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)规范的一部分,它定义了一套规则,用于指导Java程序中变量的访问和内存交互方式。
8 1
|
7天前
|
存储 运维 Java
💻Java零基础:深入了解Java内存机制
【10月更文挑战第18天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
21 1
|
10天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
17天前
|
存储 监控 算法
Java中的内存管理与垃圾回收机制解析
本文深入探讨了Java编程语言中的内存管理方式,特别是垃圾回收机制。我们将了解Java的自动内存管理是如何工作的,它如何帮助开发者避免常见的内存泄漏问题。通过分析不同垃圾回收算法(如标记-清除、复制和标记-整理)以及JVM如何选择合适的垃圾回收策略,本文旨在帮助Java开发者更好地理解和优化应用程序的性能。
|
10天前
|
监控 安全 Java
Java Z 垃圾收集器如何彻底改变内存管理
大家好,我是V哥。今天聊聊Java的ZGC(Z Garbage Collector)。ZGC是一个低延迟垃圾收集器,专为大内存应用场景设计。其核心优势包括:极低的暂停时间(通常低于10毫秒)、支持TB级内存、使用着色指针实现高效对象管理、并发压缩和去碎片化、不分代的内存管理。适用于实时数据分析、高性能服务器和在线交易系统等场景,能显著提升应用的性能和稳定性。如何启用?只需在JVM启动参数中加入`-XX:+UseZGC`即可。
134 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
324 0
|
9天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
19 1
|
14天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。