Java对象大小计算

概述

在实际应用中,尤其是在进行JVM调优时,理解并正确估计对象大小是非常重要的,因为这直接影响到内存分配、垃圾回收效率以及应用程序的整体性能。

对象的组成

在Java中,计算一个对象的大小是为了了解它在内存中占用的确切空间。Java对象在Java虚拟机(JVM)中的内存布局主要包括三个部分:

  1. 对象头(Header):
    对象头通常包含用于存储对象自身的运行时元数据,如哈希码、锁状态标志、线程持有的锁指针等信息,这部分称为mark word。
    另外,对象头还可能包含指向类元数据的指针,用于方法调度和类型信息识别。
  2. 实例数据(Instance Data):
    这是对象的实际有效载荷,包括所有字段变量(成员变量)。每个字段根据其类型有不同的大小,基本类型的大小固定,而引用类型的大小则依赖于JVM实现,通常是固定的引用宽度(如32位或64位环境下的4字节或8字节)。
  3. 对齐填充(Padding):
    为了满足特定JVM或操作系统对于内存分配的要求(比如某些硬件平台要求内存地址必须是某个字节数的倍数),JVM会在对象实例数据末尾填充额外的字节,确保整个对象占用的空间是对齐的。

Java中的基本数据类型及其大小

  1. 整数类型:
    byte: 8位(1字节),有符号整数,范围从-128到127。
    short: 16位(2字节),有符号整数,范围从-32,768到32,767。
    int: 32位(4字节),有符号整数,范围从-231到231-1(即-2,147,483,648到2,147,483,647)。
    long: 64位(8字节),有符号整数,范围从-263到263-1。
  2. 浮点类型:
    float: 32位(4字节),单精度浮点数。
    double: 64位(8字节),双精度浮点数。
  3. 字符类型:
    char: 16位(2字节),无符号Unicode字符,范围从\u0000到\uffff。
  4. 布尔类型:
    boolean: 在Java虚拟机中没有明确规定其确切的大小,但通常被视为占据至少一个比特位。然而,在内存分配时,它往往会被编译器优化成字节存储。

需要注意的是,尽管硬件架构可能不同,但在Java虚拟机中,上述基本数据类型的大小是固定的,并不依赖于运行Java程序的具体平台。

计算大小方式

要精确计算Java对象的大小,可以使用以下几种方法:

  • Instrumentation API: Java的java.lang.instrument.Instrumentation 接口提供了诸如getObjectSize()这样的方法,允许在运行时获取对象的精确大小。
  • JDK1.8有一个类jdk.nashorn.internal.ir.debug.ObjectSizeCalculator可以评估出对象的大小,直接调用静态方法ObjectSizeCalculator.getObjectSize
  • 第三方工具: 使用诸如JOL (Java Object Layout) 或 VisualVM 等工具分析堆内存,它们能够展示出对象的具体内存布局以及占用大小。
  • 手动估算: 根据上述组成原理,可以逐个累加各字段的大小来估算对象头加上实例数据的大小,但这种方法很难考虑到具体的JVM实现细节以及对齐填充的影响。

计算大小实战

这里使用第三方工具JOL

import jdk.nashorn.internal.ir.debug.ObjectSizeCalculator;
import org.openjdk.jol.info.ClassLayout;

public class ObjectSize {

    public static void main(String[] args) {
        System.out.println("只打印大小");
        System.out.println(ObjectSizeCalculator.getObjectSize(new Object()));
        System.out.println(ObjectSizeCalculator.getObjectSize(new String()));
        System.out.println(ObjectSizeCalculator.getObjectSize(new int[]{}));
        System.out.println(ObjectSizeCalculator.getObjectSize(new Integer(1)));

        System.out.println("打印对象的内存大小占用情况,详细版本");
        ClassLayout layout = ClassLayout.parseInstance(new Object());
        System.out.println(layout.toPrintable());


        System.out.println();
        ClassLayout layout2 = ClassLayout.parseInstance(new A());
        System.out.println(layout2.toPrintable());

        System.out.println();
        ClassLayout layout1 = ClassLayout.parseInstance(new int[]{});
        System.out.println(layout1.toPrintable());
    }

    public static class A {
        private Integer age;

        private String name;

        private Double balance;

        private Boolean sex;
    }
}

说明

以下对A对象的对象大小进行说明

在这里插入图片描述

总结

理解Java对象大小的重要性、组成以及计算方法,以便更好地进行内存优化和性能调优,欢迎关注:鲁班曰

参考文献

java对象在内存的大小

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue2后台管理系统demo,包含增删查改、模糊搜索、分页

因一直敲小程序,vue不熟练,自己练手项目,就包含增删查改以及模糊搜索分页 一、页面简单但功能齐全 二、数据是mock模拟 三、启动步骤 1、 json-server --watch data.json 启动mock数据 2、npm i 下载依赖 3、npm run serve 四、github地址…

【机器学习:推荐系统】什么是推荐系统?

【机器学习:推荐系统】什么是推荐系统? 推荐系统如何工作?推荐系统生命周期推荐系统算法使用推荐系统的好处推荐系统的类型协同过滤基于内容的过滤混合过滤 现实生活中的推荐系统示例亚马逊Spotify脸书/元数据Netflix谷歌和 YouTube 关于推荐…

BUUCTF---另外一个世界1

1.这是一道杂项题,也是我觉得最值得记录的一道题。 2.话不多说,题目描述(真的是另一个世界) 3.下载附件,是一张图片 4.尝试了查看属性,以及在记事本中打开看看有没有什么有用的信息,发现没什么…

基于单片机的节能窗控制系统设计

摘 要:本文以单片机为基础,对节能窗控制系统进行了科学设计,在满足日常生活需求的同时更好地实现节能减排目标。此设计中的节能窗控制系统,实际操作要灵活,具备可靠且稳定的性能,同时具备节能功效。 关键词:单片机;节能窗控制系统;系统设计 在节能窗等概念推广的背景…

Java 下载excel文件

一、背景 微信小程序需要导出excel文件,后端技术Java,前端使用uniapp框架,使用excel模板。 二、excel 报表模板 需要补充的内容是以下标记问号的,其中有个表格,内容是动态添加的 三、Java端代码实现 关键步骤&…

LabVIEW流量控制系统

LabVIEW流量控制系统 为响应水下航行体操纵舵翼环量控制技术的试验研究需求,通过LabVIEW开发了一套小量程流量控制系统。该系统能够满足特定流量控制范围及精度要求,展现了其在实验研究中的经济性、可靠性和实用性,具有良好的推广价值。 项…

【OpenCV】绘制桌面锁屏时钟

OpenCV 是一个开源的计算机视觉(Computer Vision)与机器学习软件库,提供了多种图像处理算法与接口,用于解决计算机视觉相关问题。OpenCV 支持多平台与多语言,本文主要记录如何使用 OpenCV-Python 绘制桌面锁屏时钟。 目…

NX二次开发:ListingWindow窗口的应用

一、概述 在NX二次开发的学习中,浏览博客时发现看到[社恐猫]和[王牌飞行员_里海]这两篇博客中写道有关信息窗口内容的打印和将窗口内容保存为txt,个人人为在二次开发项目很有必要,因此做以下记录。 ListingWindow信息窗口发送信息四种位置类型 设置Listi…

【VPX637】基于XCKU115 FPGA+ZU15EG MPSOC的6U VPX双FMC接口通用信号处理平台

VPX637是一款基于6U VPX总线架构的通用实时信号处理平台,该平台采用一片Xilinx的高性能Kintex UltraScale系列FPGA(XCKU115-2FLVF1924I)作为预处理单元,外挂2个FMC扩展接口,来完成数据采集、数据回放以及实时信号处理算…

NLP Seq2Seq模型

🍨 本文为[🔗365天深度学习训练营学习记录博客🍦 参考文章:365天深度学习训练营🍖 原作者:[K同学啊 | 接辅导、项目定制]\n🚀 文章来源:[K同学的学习圈子](https://www.yuque.com/mi…

wireshark抓取localhost(127.0.0.1)数据包

打开wireshark中,在"capture"菜单中,选择"interfaces"子菜单,在列出的接口中选中"Adapter for loopback traffic capture"即可。 必须安装了Npcap才有此选项,否则需要重新安装wireshark。 抓包截图…

Vue+SpringBoot打造城市桥梁道路管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询城市桥梁4.2 新增城市桥梁4.3 编辑城市桥梁4.4 删除城市桥梁4.5 查询单个城市桥梁 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的城市桥梁道路管理系统,支持…

gpt批量工具,gpt批量生成文章工具

GPT批量工具在今天的数字化时代扮演着越来越重要的角色,它们通过人工智能技术,可以自动批量生成各种类型的文章,为用户提供了便利和效率。本文将介绍5款不同的GPT批量工具,并介绍一款知名的147GPT生成工具,以及另外一款…

beets,一个有趣的 Python 音乐信息管理工具!

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站AI学习网站。 目录 前言 什么是Beet库? 安装Beet库 使用Beet库 Beet库的功能特性 1. 多种音乐格式支持 2. 自动标签识…

ECMAScript-262 @2023版本中的关键字和保留字

1、什么是标识符? 所谓标识符,就是javascript里的变量、函数、属性或函数参数的名称,可由一个或多个字符组成,当然标识符有命名规范 标识符第一个字符必须是 一个字母、下划线(_)或美元符号($…

在 Rust 中实现 TCP : 1. 联通内核与用户空间的桥梁

内核-用户空间鸿沟 构建自己的 TCP栈是一项极具挑战的任务。通常,当用户空间应用程序需要互联网连接时,它们会调用操作系统内核提供的高级 API。这些 API 帮助应用程序 连接网络创建、发送和接收数据,从而消除了直接处理原始数据包的复杂性。…

烧脑问题解决办法:如何选择一款合适自己的手机流量卡

现在社会人们越来越离不开手机了,手机给我们生活带来了翻天覆地的变化,手机需要最多的就是流量了,所以选择一款合适自己的手机流量卡就显得尤为重要了,今天小编就给大家来分享一下我的经验,希望对大家能有帮助&#xf…

STM32合并烧录IAP+APP

STM32合并烧录IAPAPP 通过查找相关资料 有以下几种合并方法 第一种直接将二进制文件用记事本合并 而要合并的就是就将IAP最后的一行删除,然后将APP程序追加在后面。 (修改前) 把APP的.hex 全部内容拷贝复制到 刚才删掉结束语句的 IAP的.…

基于springboot+vue的公交线路查询系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?

原文链接:如何用ChatGPTGEEENVIPython进行高光谱,多光谱成像遥感数据处理? 第一:遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二:ChatGPT ChatGPT可以做什么? ChatGPT演示使用 …