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天前
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
14 1
|
1月前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
60 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
1月前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
57 3
|
1月前
|
缓存 监控 算法
Python内存管理:掌握对象的生命周期与垃圾回收机制####
本文深入探讨了Python中的内存管理机制,特别是对象的生命周期和垃圾回收过程。通过理解引用计数、标记-清除及分代收集等核心概念,帮助开发者优化程序性能,避免内存泄漏。 ####
56 3
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
201 4
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
142 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
2月前
|
SQL Java 数据库连接
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,有效减少连接开销,提升访问效率。本文介绍了连接池的工作原理、优势及实现方法,并提供了HikariCP的示例代码。
70 3
|
2月前
|
SQL Java 数据库连接
打破瓶颈:利用Java连接池技术提升数据库访问效率
在Java应用中,数据库访问常成为性能瓶颈。连接池技术通过预建立并复用数据库连接,避免了频繁的连接建立和断开,显著提升了数据库访问效率。常见的连接池库包括HikariCP、C3P0和DBCP,它们提供了丰富的配置选项和强大的功能,帮助优化应用性能。
103 2
|
3月前
|
Java
Java访问外网图片地址时,如何添加代理?
【10月更文挑战第14天】Java访问外网图片地址时,如何添加代理?
78 2