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对象在内存的大小

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

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

相关文章

【洛谷 P9240】[蓝桥杯 2023 省 B] 冶炼金属 题解(二分答案)

[蓝桥杯 2023 省 B] 冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V V V, V V V 是一个正整数,这意味着消耗 V V V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普…

聊聊 HTTP 性能优化

作为用户的我们在 "上网冲浪" 的时候总是希望快一点,尤其是抢演唱会门票的时候,但是现实并非如此,有时候我们会遇到页面加载缓慢、响应延迟的情况。 而 HTTP 协议作为互联网世界的基础,从网站打开速度到移动应用的响应…

P8538 「Wdoi-2」灵山之上神风起 题解

「Wdoi-2」灵山之上神风起 传送门 题目背景 在天狗记者射命丸文的指(放)引(水)之下,灵梦一行人找到了山中的神社。 “在妖怪之山上还真的存在其他的神社啊。”灵梦感慨道。她们看到了由树木建造的神社正殿&#xf…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题(十分十分的巧妙): 显然我们应该一行一行放,又竖的会对下一行产生影响,我们令横着放为0,竖着放的上方为1. 对于下一行,前一行放1的下面为0,但是会出现…

Flink基本原理 + WebUI说明 + 常见问题分析

Flink 概述 Flink 是一个用于进行大规模数据处理的开源框架,它提供了一个流式的数据处理 API,支持多种编程语言和运行时环境。Flink 的核心优点包括: 低延迟:Flink 可以在毫秒级的时间内处理数据,提供了低延迟的数据…

靶机渗透之My File Server: 1

Name: My File Server: 1Date release: 21 Feb 2020Author: Akanksha Sachin VermaSeries: My File ServerDownload: https://drive.google.com/uc?id1w0grAomPuFaIohBcUwDiI3QIi4fj4kje&exportdownload 对于vulnhub中的靶机,我们都需先下载镜像,然…

【Sora原理与技术实战】Task1 Sora技术原理解析

本笔记来源:开源组织Datawhale24年组队学习 笔记链接:https://datawhaler.feishu.cn/wiki/LxSCw0EyRidru1kFkttc1jNQnnh 直播回看:https://www.bilibili.com/video/BV1wm411f7gf/ For the learner for the dreamer Sora技术原理解析 Sora具体…

vue3 + vite 项目可以使用纯Js开发吗?

答案:可以 创建项目: 按照链接参考或者按官方: webstorm 创建vue3 vite 项目-CSDN博客 项目目录 tsconfig.json 配置允许js allowJs指定是否编译js文件,在任意文件当中,如果我们模块使用js写的,那么我们需要 将all…

java基础-mysql

文章目录 mysql基础面试题什么是mysql什么是事务并发事务带来的影响事物的隔离级别索引大表优化什么是池化思想,什么是数据库连接池,为什么要用数据库连接池⾏锁,表锁;乐观锁,悲观锁MySQL主备同步的基本原理SQL什么情况…

Java | Java中与文件同名的类的构造函数的调用

在Java的学习过程中遇到了这样一段代码: public class Test1 {int a1;public static void main(String []args){System.out.println("java");}public Test1(){System.out.println("构造函数");} }它的运行结果是这样的,构造函数中的…

【kubernetes VPA】记录一次安装 VPA 相关组件的报错解决过程

文章目录 1. 问题描述2. 问题原因3. 解决办法4. 参考链接 1. 问题描述 在执行 ./hack/vpa-up.sh脚本命令时,提示有报错。名为vpa-admission-controller的容器状态一直停留在ContainerCreating,从该Pod详细描述中得知,volume "tls-certs…

面向企业的人脸特效SDK解决方案

随着科技的进步和消费者对高质量体验的需求增加,人脸特效技术已经逐渐渗透到各个领域,包括社交媒体、游戏、广告、影视制作等。为了满足这一需求,美摄科技推出了一款高效、稳定且易于集成的人脸特效SDK解决方案。 美摄科技的人脸特效SDK解决…