Java对象的内存分布(一)

一、概览

在Hotspot虚拟机中,java对象在内存中分布如下图所示:

+---------------+---------------+---------------+
|   对象头       |   实例数据   	|	 对齐填充    |
+---------------+---------------+---------------+
对象大小 = 对象头 + 实例数据 + [填充数据]
  • 对象头:任何对象都包含对象头,用于存储该对象的class类型指针、GC年龄、HashCode、锁标志等信息;
  • 实例数据:业务定义的数据;
  • 对齐填充
    • java规定内存默认使用8字节对齐,方便寻址,提升效率(以空间换时间);
    • 该部分不是必需的,即前面对象头和实例数据的大小之和不是8的倍数(8N),则补齐空间到8N;否则,无需对齐填充部分。
    • 对齐8字节这个参数可以通过JVM参数-XX:ObjectAlignmentInBytes来改变(默认值为8)。当然这个数值的必须是2的次幂,数值范围需要在8 - 256之间。

二、代码实例

2.1、 准备工作

  • 为了方便我们查看java对象内存分布,我们需借助 jol(Java Object Layout)这个小工具;
  • jol maven坐标
<dependency><groupId>org.openjdk.jol</groupId><artifactId>jol-core</artifactId><version>0.10</version>
</dependency>

2.2 、代码

import org.openjdk.jol.info.ClassLayout;public class Head {public static void main(String[] args) throws InterruptedException {System.out.println("查看 Empty 对象");System.out.println(ClassLayout.parseInstance(new Empty()).toPrintable());System.out.println("查看 UserPadding 对象");System.out.println(ClassLayout.parseInstance(new UserPadding()).toPrintable());System.out.println("查看 UserNoPadding 对象");System.out.println(ClassLayout.parseInstance(new UserNoPadding()).toPrintable());}static class Empty{}static class UserPadding{int age;  // 4个字节long date; // 8个字节String name; // 4个字节}static class UserNoPadding extends UserPadding{int salary;}
}

2.3、运行结果在这里插入图片描述

附:

  • OFFSET:表示偏移量
  • SIZE:占用字节大小
  • TYPE:具体类型
  • DESCRIPTION:字段名称;(object header)为对象头
  • VALUE:取值,基本类型存的就是实际值,引用类型存的是指针
  • 当前运行jvm为 64-bit HotSpot VM

2.4、分析

2.4.1、Empty对象

  • 对象头:占用12(4+4+4)字节
  • 实例数据:占用0(该对象没有业务数据)
  • 对齐填充:前面一共占用12(12 + 0)字节,填充4字节使得整个对象占用16字节,对齐8N;

2.4.2、UserPadding对象

  • 对象头:占用12(4+4+4)字节
  • 实例数据:占用16字节(int 4字节,long 8字节, String 4字节指针)
  • 对齐填充:前面一共占用28(12 + 16)字节,填充4字节使得整个对象占用32字节,对齐8N;

2.4.3、UserNoPadding对象

  • 对象头:占用12(4+4+4)字节
  • 实例数据:占用20字节(2个 int 8字节,long 8字节, String 4字节指针)
  • 对齐填充:前面一共占用32(12 + 20)字节,已经对齐8N,无需填充;

2.4.4、业务数据的默认值

观察UserPadding对象的业务数据默认值(用户并未显示指定值),可以看到:

  • 数据类型默认为0;
  • 引用类型默认null

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/890619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker部署微信小程序自动构建发布和更新

通过 Jenkins 和 Docker 部署微信小程序&#xff0c;并实现自动构建、发布和版本更新&#xff0c;主要涉及以下几个步骤&#xff1a; 设置 Jenkins 环境配置 GitLab 与 Jenkins 的集成构建 Docker 镜像部署和发布微信小程序配置 Jenkins 自动构建 以下是详细的步骤说明&#…

RY2200 One Cell Li-ion and Li-poly Battery Protection IC

1、Features Protection ofCharger Reverse Connection 50mΩ Low RssoN) Internal Power MOSFET Protection of Battery Cell Reverse Connection Delay Times are generated inside Over-temperature Protection …

鼎盛合|高转速无刷风扇方案设计开发

在现代科技飞速发展的时代&#xff0c;人们对于电器设备的性能要求越来越高。风扇作为一种常见的电器&#xff0c;在日常生活和工业生产中都有着广泛的应用。而高转速无刷风扇以其高效、低噪、长寿命等优点&#xff0c;逐渐成为了市场的宠儿。本文将详细探讨高转速无刷风扇的方…

H3C MPLS跨域optionB

实验拓扑 实验需求 如图,VPN1 和 VPN2 分别通过运营商 MPLS VPN 连接各自分支机构按照图示配置 IP 地址,VPN1 和 VPN2 连接同一个 PE 设备的私网 IP 网段存在地址复用,使用多 VRF 技术来防止 IP 冲突AS 100 和 AS 200 内部的公共网络中各自运行 OSPF 使 AS 内各设备的 Loo…

harmony动画属性

属性动画 显式动画 转场动画

【day16】Java开发常用API

模块15回顾 在深入探讨模块16之前&#xff0c;让我们回顾一下【day15】中的重点内容&#xff1a; String类&#xff1a; 构造方法&#xff1a;String(), String(String s), String(char[] chars), String(byte[] bytes), String(char[] chars, int offset, int count), String…

申请腾讯混元的API Key并且使用LobeChat调用混元AI

申请腾讯混元的API Key并且使用LobeChat调用混元AI 之前星哥写了一篇文章《手把手教拥有你自己的大模型ChatGPT和Gemini等应用-开源lobe-chat》搭建的开源项目&#xff0c;今天这篇文章教大家如何添加腾讯云的混元模型&#xff0c;并且使用LobeChat调用腾讯混元AI。 申请腾讯混…

es 中使用update 、create 、index的区别

文章目录 1. index 操作示例&#xff1a;index 操作Bulk 示例中的 index 操作&#xff1a; 2. create 操作示例&#xff1a;create 操作Bulk 示例中的 create 操作&#xff1a; 3. update 操作示例&#xff1a;update 操作Bulk 示例中的 update 操作&#xff1a; 4. 区别总结总…

3D几何建模引擎Parasolid功能解析

一、什么是Parasolid&#xff1f; Parasolid是由Siemens PLM Software开发的高精度精密几何建模引擎。它全面评估CAD&#xff08;计算机辅助设计&#xff09;、CAM&#xff08;计算机辅助制造&#xff09;、CAE&#xff08;计算机辅助工程&#xff09;、PLM&#xff08;产品生…

【深度学习-调参】Batch 大小与类别数到底有没有潜在的关系?

文章目录 深度学习中的 Batch 概念为什么关注批次内的类别分布?合理的类别分布策略1. 保持与整体数据集的类别比例一致2. 固定每个类别的采样数量3. 动态采样(自适应采样)不同场景下的选择Batch 大小与类别数之间的关系结语使用 PyTorch 的 `WeightedRandomSampler` 来平衡批…

QT开发【常用控件1】-Layouts Spacers

在 Qt 中&#xff0c;布局&#xff08;Layouts&#xff09;和间距&#xff08;Spacers&#xff09;是创建用户界面的关键组成部分。它们帮助开发者在窗口或对话框中组织和排列控件&#xff0c;以实现灵活和美观的界面设计。 1. 布局&#xff08;Layouts&#xff09; 布局是 Q…

flink sink doris

接上文&#xff1a;一文说清flink从编码到部署上线 网上关于flink sink drois的例子较多&#xff0c;大部分不太全面&#xff0c;故本文详细说明&#xff0c;且提供完整代码。 flink doris版本对照表 1.添加依赖 <!--doris cdc--><!-- 参考&#xff1a;"https…

【EthIf-14】EthIfGeneral容器配置-02

1.实际EthIfGeneral的配置实例 关闭DET接口开启发送确认中断开启接收中断主周期接收timeout主周期 2. 代码实例参考 阅读此部分代码,搞清楚代码分为几个section,大概瞄一眼就好,不用深究其含义,只需有一个宏观的层次结构的映像即可。 //Appl/GenData/EthIf_Cfg.h #

修炼内功之函数栈帧的创建与销毁

修炼内功之函数栈帧的创建与销毁 一 前置知识&#xff08;1&#xff09;栈&#xff08;2&#xff09;相关寄存器和汇编指令 二 函数栈帧三 代码演示函数栈帧的创建&#xff08;1&#xff09;代码演示&#xff08;2&#xff09;函数栈帧逐帧分析 四 对开篇问题的解答 相信来CSDN…

QT用Enigmavb 打包成单独exe

QT用这个工具打包成单个exe&#xff0c;然后再用winrar打包成zip可以发给别人 在之前需要用QT的release打包 之前的文章QTrelease打包【非单个exe】 Enigmavb 打包流程&#xff1a; 安装过程&#xff1a; next-》i accept -》选择安装位置 -》next -》Create a desktop ic…

云原生后端开发(一)

云原生后端开发 云原生&#xff08;Cloud-Native&#xff09;是指一种构建和运行应用程序的方式&#xff0c;它充分利用了云计算的特点&#xff0c;比如弹性伸缩、自动化部署、容器化等。在云原生的架构下&#xff0c;后端应用通常具备高度可扩展、可维护、易于自动化管理的特…

图的最短路径(C++实现图【4】)

目录 1. 最短路径 1.1单源最短路径--Dijkstra算法 代码实现 1.2 单源最短路径--Bellman-Ford算法 代码实现 1.3 多源最短路径--Floyd-Warshall算法 代码实现 1. 最短路径 最短路径问题&#xff1a;从在带权有向图G中的某一顶点出发&#xff0c;找出一条通往另一顶点的最短路径&…

udp tcp协议

文章目录 1. UDP协议1.1 端口号1.2 UDP协议格式1.3 UDP特性1.4 报文的封装 2. TCP协议2.1 TCP协议格式2.2 TCP策略2.2.1 确认应答机制(ACK)序号与确认序号6个标志位序号的理解 2.2.2 超时重传机制2.2.3 连接管理机制三次握手四次挥手理解三次握手理解四次挥手 2.2.4 流量控制2.…

【C++ 基础】从C到C++有哪些变化

C到C C相比C语言来说&#xff0c;多了两个核心&#xff0c;五个内容&#xff1a;1、面向对象的思维&#xff1b;2、模板&#xff08;泛型编型&#xff09;1.bool 2.引用 3.内联 4.重载 5.缺省参数变量 数据类型 bool 布尔 占1个字节 取值&#xff1a;true false bool isMax(i…

提高保养效率:4S店预约系统的设计与开发

3.1可行性分析 开发者在进行开发系统之前&#xff0c;都需要进行可行性分析&#xff0c;保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该4S店预约保养系统所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识&#xff…