Java基础知识:如何计算Java对象占用内存大小?

如何计算Java对象所占内存的大小 摘要:本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-Klass模型等内容。关键词:HotspotVM、Java对象头、HSDB、锁原理、分代GC、OOP-Klass摘要 本文以如何计算Java对象占用内存大小为切入点... 阅读详情

在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小。今天就和大家分享一下如何计算Java对象占用内存大小。

图片.png

一、对象头

对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下:

对象的HashCode,锁信息等

到对象类型数据的指针

数组的长度(如果是数组的话)

二、分配对象时的基本规则

首先,任何对象都是8字节对齐,属性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的顺序存放,举个例子:在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

public class Test { byte a; int b; boolean c; long d; Object e; }

如果这个对象的属性按照顺序存放的话,要占用的空间为:head(8) + a(1) + padding(3) + b(4) + c(1) +

padding(7) + d(8) + e(4) + padding(4) = 40。但是按照这个规则得到:head(8) + d(8) + b(4) +

a(1) + c(1) + padding(2) + e(4) + padding(4) = 32。可以看到节省了不少空间。

在涉及继承关系的时候有一个最基本的规则:首先存放父类中的成员,接着才是子类中的成员,举个例子:

class A { long a; int b; int c; } class B extends A { long d; }

这样存放的顺序及占用空间如下:head(8) + a(8) + b(4) + c(4) + d(8) =

32。那如果父类中的属性不够八个字节怎么办?这样就有了新的一条规则:父类中最后一个成员与子类的第一个成员的间隔如果不够4个字节,此时需要扩展到4个字节的基本单位,举个例子:

class A { byte a; } class B extends A { byte b; }

那么此时占用的空间如下:head(8) + a(1) + padding(3) + b(1) + padding(3) =16。显然这种方式比较浪费空间,那么就有了:如果子类的第一个成员是double或者long,并且父类并没有用完8个字节,JVM会破坏规将较小的数据填充到该空间,举个例子:

class A { byte a; } class B extends A { long b; short c; byte d; }

此时占用的空间如下:head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) =24。

Java计算一个对象占用内存的大小 在C/C++中计算某一个基本类型或者对象占用内存大小的方法很简单,只要调用库里面的sizeof()操作符即可,但是在Java的API里面并没有给我们提供类似的方法。那么我们可不可以自己实现一个Java中的sizeof()方法呢?答案是肯定的。为了计算一个Java对象占用内存的大小,首先你得对Java对象的内存结构有所了解。如果你还不了解,请先阅读Java内存结构。 首先介绍一下sun.misc. 阅读详情

相关推荐

计算 java对象 内存占用大小

前言 作为小白,关于Java对象的大小还停留在 8种基本类型和其包装类占用几个字节的 阶段。最近,突然发现Java对象的内存大小似乎不这么简单,就想暂且写点东西,记录一下新知识。 Java对象内存结构 总体上,提到java对象内存大小,主要分为 数组类型和非数组类型 两大类来探究。 就如同下图一样,所有的java对象一般包括 对象头(Header),实例数据(Instance data),对齐...

weixin_42260270的博客 2459

Java对象内存空间大小计算

内存对象大小计算,bitset 1亿key大小计算 bitmap一亿大小计算

u014618954的博客 5475

如何计算Java对象的内存占用?探索对象内存大小的方法与实现

然而,Java虚拟机(JVM)中对象的内存布局和分配方式复杂多样,对于精确计算对象的内存占用并不是一件容易的事情。基本数据类型占用的内存大小是固定的,而引用类型的大小与具体的JVM实现有关。使用压缩指针:某些JVM提供了压缩指针的功能,可以减小对象引M提供了压缩指针的功能,可以减小对象引用的内存占用。使用对象池或缓存:对于重复创建的对象,可以使用对象池或缓存来共享对象实例,从而减少对象的创建和销毁开销。减少字段数量和使用更小的数据类型:通过精简对象的字段数量和使用更小的数据类型,可以减少对象的内存占用。

ByteGlide的博客 486

4种方法教你如何查看java对象所占内存大小

如果需要查看某个对象的详细内存分布,可以借助jol工具类,不过这种当对象中内嵌其他对象时,只能计算ClassLayout方法中这个object对象所占内存的大小。当一个对象有多个属性,需要计算整个对象的大小时,可以借助org.apache.lucene工具类。使用这种jdk8方式时,Open JDK 不是天然支持的,需要set一下环境变量。最后,计算一个对象占用多大内存,需要提前了解java对象的布局,可以参考这篇。先引入maven坐标。先导入maven坐标。

moonNife的专栏 9689

Java对象内存大小计算方法深入剖析

Java作为一种高级编程语言,其对象内存布局的复杂性主要源自于Java虚拟机(JVM)的内存管理和自动垃圾回收机制。JVM通过一种叫做“堆”的内存区域来存储所有的对象实例,这包括了对象头、实例数据、对齐填充等部分。Unsafe是Java提供的一个特殊的类,它提供了直接操作内存的功能,通过这个类我们可以访问一些底层的内存操作,从而更精确地计算对象的大小。但是,Unsafe并不是公开API的一部分,使用时需要慎重,因为它的使用违反了Java的常规安全机制。

weixin_31641077的博客 607

Python数据分析案例——宏观经济指标与沪深指数实证研究分析

沪深300指数与宏观经济指标关联性研究:2015-2024实证分析 摘要:本文基于2015-2024年月度数据,采用多元回归方法分析宏观经济指标对沪深300指数的影响。研究发现,市场情绪(SEN)、美国利率(STY)、美元指数(DXY)、狭义货币供应量(M1)和CPI对指数具有显著解释力(P<0.05),而GDP、LPR等传统指标影响不显著。模型解释力达62%(R²=0.62),表明A股短期走势更受资金流动、投资者心理和国际金融条件驱动。研究为投资者提供了除基本面外的市场预判指标,建议关注M1增速、美

weixin_50902344的博客 1404

计算Java对象大小(附实际例子分析)

对象大小包括俩部分的内容,对象头和对象内容。(图片源于网络)。在一些情况下,我们需要计算Java对象的大小,以合理分配内存。

li12412414的博客 4625

Telegram Bot Api使用教程

其中token为你的机器人token,method为telegram给定的方法,在获取群组chat_id那一步就使用了telegram的其中一个方法(getUpdates),其他方法后面会介绍。telegram发送消息的方式类似与钉钉机器人,都是向一个api发送http请求,而且对于同一个APItelegram支持GET和POST两种请求方式.请求的api格式如下。通常来说我们都需要让机器人在一个群组里工作,所以首先我们需要将机器人添加到我们指定的群组,在群组里发送随意消息并@这个机器人,比如...

豫迷糊的码上生活 1万+

Java 中对象占用内存大小计算

bit:位,比特。信息的最小单位,二进制数中的一个位数 (二进制位),其值为“0” 或“1”;byte: 字节。计算机文件大小的基本计算单位;原码:正数本身,负数,正数对应的二进制最高位为 1(负);反码:正数本身,负数,符号位不变,其余各位取反;补码:正数本身,负数:反码 + 10 的反码、补码都为零注意: 计算机处理是以补码形式,我们最终看到的是原码形式例如: 列表 Java 基本类型注意:对于数组 32,默认为 int 型,32B 为 byte 类型,32S 为 short 类型,32L 为 long

嘻哈熊的专栏 2194

HTTPS接口测试翻车实录:为什么浏览器能访问而curl报证书错误?

本文深入分析了HTTPS接口测试中浏览器访问正常而curl报证书错误的典型问题。通过对比浏览器、Postman和curl的工具行为差异,结合Nginx日志与Wireshark抓包,揭示了问题根源在于网络架构中HTTPS请求被意外“降级”为HTTP传输,导致SSL握手失败。文章重点探讨了curl工具严格验证机制暴露的`Peer's Certificate issuer is not recognized`错误,并提供了网络配置修正方案与标准化测试流程。

u9v0w的博客 278

契约锁代码审计分析

但是正常来讲,定义了这么多的路由,肯定会有一个通用的判断逻辑,来判断请求的url是否和这些路由匹配。POC中有一点值得注意,Spring新一些的版本中支持以表单的形式来为参数赋值,且无需用注解。但是需要注意4.2.8的代码逻辑和新版本中的不同,此漏洞可能存在于版本大于4.2.8的版本中。方法用于解析LICENSE,先进行AES解密,再从字符串转换成json格式的License。loadPath实际判断传入的path是否和下面的path相等,如果不相等返回null。,如果包含这三个中的一个就会抛出异常。

好记性不如烂笔头 5716

你的 Java 对象占用了多少内存

对齐应该是 2 的幂,并且在 64 位架构上不能超过 4 个字节。

周国通的博客 1012

PyQt5简介和安装

在initUI方法中,设置了窗口的标题和大小,并创建了一个按钮。PyQt5是一个功能强大的Python界面开发框架,可以轻松创建跨平台的图形用户界面应用程序。本文介绍了PyQt5的简介和安装方法,并提供了一个简单的示例应用程序来演示PyQt5的基本用法。PyQt5是一个功能强大的Python界面开发框架,它提供了丰富的工具和组件,用于创建跨平台的图形用户界面(GUI)应用程序。信号是控件发出的事件,槽是与之关联的处理函数。接下来,我们将编写一个简单的PyQt5应用程序,以演示PyQt5的基本用法。

XdKwargs的博客 222

long 内存 java_Java基础知识:如何计算Java对象占用内存大小?

原标题:Java基础知识:如何计算Java对象占用内存大小?在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小。今天就和大家分享一下如何计算Java对象占用内存大小。 一、对象头对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下:对象的HashCode,锁信息等到对象类...

weixin_36334284的博客 443

《中国电信运营商骨干网:历史、现状与未来演进》系列 第一篇:中国骨干网全景图:一级运营商与专用网络的演进

揭秘国家信息高速公路!一文读懂什么是骨干网,它如何支撑我们的数字生活,以及电信、联通、移动、广电等巨头如何构建这张“国家级动脉”。

maqh_csdn的博客 2037

Roboguide与TIA V16通讯

Roboguide与TIA V16通讯

haier123888的博客 2674

Java中对象占用内存大小计算

Java中对象占用内存大小计算 可以直接进入正题对象的组成这一节 byte与bit bit: 位,比特。 信息的最小单位,二进制数中的一个位数(二进制位),其值为“0”或“1”; byte: 字节。计算机文件大小的基本计算单位; 原码:正数本身,负数,正数对应的二进制最高位为1(负); 反码:正数本身,负数,符号位不变,其余各位取反; 补码:正数本身,负数:反码+1 0的反码、补码都为零 注意...

纸上得来终觉浅,绝知此事要躬行 1133

调用魔搭API出现Please bind your Alibaba Cloud account before use的解决方案

本文主要介绍了调用魔搭API出现Please bind your Alibaba Cloud account before use解决方案,希望能对使用大模型的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 3万+

【Java笔记】JVM:对象在内存中是什么样的?如何计算对象占用的内存大小?

Object类本身不含成员变量,所以instance data为0,两个header word总共位8+4=12B,Padding补齐为16字节。可以看出,由于String是另一个对象,Mycalss的instance data。openjdk jol提供了计算对象内存布局的方法,即。

Hansdas的博客 1525

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java String 占用内存大小分析

一般而言,Java 对象在虚拟机的结构如下: •对象头(object header):8 个字节(保存对象的 class 信息、ID、在虚拟机中的状态) •Java 原始类型数据:如 int, float, char 等类型的数据 •引用(reference):4 个字节 •填充符(padding) jdk 1.8中String对象的成员如下: /** The value is used f...

mafei6827的博客 2万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

计算Java对象内存大小

摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-Klass模型等内容。最后推荐JDK自带的Hotspot Debug工具——HSDB,来查看对象在内存中的具体存在形式,以论证文中所述内容。 背景 目前我们系统的业务代...

u011250186的博客 2744

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java对象占用内存的说法_如何计算Java对象占用内存大小?

如何计算Java对象占用了多少空间?在Java中没有sizeof运算符,所以没办法知道一个对象到底占用了多大的空间,但是在分配对象的时候会有一些基本的规则,我们根据这些规则大致能判断出来对象大小。今天华清Java学院小编就和大家分享一下如何计算Java对象占用内存大小。一、对象头对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下:对象的HashCode,锁信息等到对象类型数据...

weixin_39686353的博客 365

使用RamUsageEstimator计算对象占用堆的内存大小

maven <!-- https://mvnrepository.com/artifact/com.carrotsearch/java-sizeof --> <dependency> <groupId>com.carrotsearch</groupId> <artifactId>java-sizeof</artifactId> <versio

永无止境 6384

Java对象占用内存大小

new Object()将占用多少bytes的内存空间?  原生类型(primitive type)的内存占用Primitive Type             Memory Required(bytes)—————————————————————boolean                      1byte                            1short    ...

sunqi 450

JVM —— Java 对象占用空间大小计算

为什么要知道 Java 对象占用空间大小? Java 里面一切都是对象,每天都在使用的 Java 对象占据多少内存空间,原来竟是这样...

wenniuwuren 1万+
上一篇: Java程序员找工作难点在哪里?关键在于对症下药
下一篇: 程序员面试常见5大“套路”,如何反套路获得加分?
jvm大志
博客等级 码龄5年 3粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值