Java对象创建、分配、布局、访问小析(HotSpot虚拟机)(二)

简介: 本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的内存布局。 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头、实例数据、对齐填充(Padding)。在32位虚拟机中对象头的大小是8个字节,在64位虚拟机中对象头的大小是16个字节, 如果开启压缩的话,对象头的大小是12个字节。对象头包含两部分的

本文内容总结自周志明先生所编著的《深入理解Java虚拟机-JVM高级特性与最佳实践》此书的经典不必多说。本节内容是对象的内存布局。

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头、实例数据、对齐填充(Padding)。在32位虚拟机中对象头的大小是8个字节,在64位虚拟机中对象头的大小是16个字节, 如果开启压缩的话,对象头的大小是12个字节。对象头包含两部分的信息,一部分是对象自身的运行时数据,包含哈希码、GC分代年龄、锁状态信息、线程持有的锁、偏向线程ID、偏向时间戳等。另一部分的信息是类型指针。虚拟机可以通过这个来确定这个对象是哪个类的实例(但不是所有的虚拟机都必须在对象数据上保留类型指针,因为对象访问方式有使用句柄和直接指针两种方式)。如果对象是数据,则对象头中还有一部分数据用来记录数据长度。关于对象头信息的一些例子:

对象头的长度


Java对象头的存储结构(32位虚拟机)


对象头的状态变化(32位虚拟机)


64位虚拟机


实例数据部分是对象真正存储的有效信息,也是在程序代码中所定义的各种类型的字段内容。对象中的字段存储顺序和在代码中写的顺序是不同的。在HotSpot虚拟机中,默认的分配策略是long/double、int/float、short/char、byte/boolean、oops(对象引用)。这些字段所占用的内存大小为:long / double - 8 bytes,int / float - 4 bytes,short / char - 2 bytes,byte/boolean - 1 bytes,reference type - 4 or 8 bytes。long/double要求8字节对齐。相同字宽的字段总是被分配到一起。

对齐填充不是必然存放的,它仅仅起着占位符的作用。HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍,也就是对象的大小必须是8字节的整数倍。

内存布局大家可以参考这一篇文章:http://blog.csdn.net/lqp276/article/details/52190503。


相关文章
|
Java 开发工具
【Azure Storage Account】Java Code访问Storage Account File Share的上传和下载代码示例
本文介绍如何使用Java通过azure-storage-file-share SDK实现Azure文件共享的上传下载。包含依赖引入、客户端创建及完整示例代码,助你快速集成Azure File Share功能。
768 6
|
Java 虚拟化 容器
(Java)Java里JFrame窗体的基本操作(容器布局篇-1)
容器 容器,我的理解是可以包容其他东西的玩意。它可以是一个盒子,可以是一个虚拟化的物品,可只要能包裹住其他存在质体的东西,那么都可以称作是容器。例如:JPanel组件和JScollPane组件两者都是容器也是组件。 既然有容器,那么容器中的布局就必不可少了。不然不规矩的摆放物品,人类看不习惯,我也看不习惯 ???? 本篇内容,将说明java JFrame窗体里容器中几类布局。 说明:所有在JFrame窗体里的容器布局都会使用setLayout()方法,采用的布局参数都将放进这个方法里 绝对布局 调用窗体容器
321 1
|
存储 安全 Java
java: 无法访问org.springframework.ldap.core.LdapTemplate
java: 无法访问org.springframework.ldap.core.LdapTemplate
330 9
|
存储 Java
Java对象的内存布局
在HotSpot虚拟机中,Java对象的内存布局分为三部分:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。对象头包含Mark Word、Class对象指针及数组长度;实例数据存储对象的实际字段内容;对齐填充用于确保对象大小为8字节的整数倍。
305 0
|
缓存 Java 数据库
Java 访问修饰符使用方法与组件封装方法详细说明
本文详细介绍了Java中访问修饰符(`public`、`private`、`protected`、默认)的使用方法,并结合代码示例讲解了组件封装的核心思想与实现技巧。内容涵盖数据封装、继承扩展、模块化设计与接口隔离等关键技术点,帮助开发者提升代码的可维护性与安全性,适用于Java初学者及进阶开发者学习参考。
315 1
|
存储 算法 安全
Java对象创建和访问
Java对象创建过程包括类加载检查、内存分配(指针碰撞或空闲列表)、内存初始化、对象头设置及初始化方法执行。访问方式有句柄和直接指针两种,前者稳定但需额外定位,后者速度快。对象创建涉及并发安全、垃圾回收等机制。
232 0
Java对象创建和访问
|
NoSQL JavaScript 前端开发
Java访问MongoDB
Java访问MongoDB
319 21
|
SQL Java 数据库连接
【潜意识Java】深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
深入理解MyBatis的Mapper层,以及让数据访问更高效的详细分析
3336 1
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。