java对象占内存大小

如何计算Java对象所占内存的大小 摘要:本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型、锁原理、分代GC、OOP-Klass模型等内容。关键词:HotspotVM、Java对象头、HSDB、锁原理、分代GC、OOP-Klass摘要 本文以如何计算Java对象占用内存大小为切入点... 阅读详情
空对象占8个字节 
有数据成员的话,你把数据成员按基本数据类型和对象引用分开统计。 
基本数据类型按byte/boolean=1,char/short=2,int/float=4,long/double=8,累加,然后对齐到8的倍数。 
对象引用按每个4字节,累加,然后对齐到8个字节的倍数。 
============= 
对象占用字节数=基本的8字节+基本数据类型所占的+对象引用所占的 

比如 
class A{ 
int a; 
char b; 
} 
占 8(基本)+8(int 4+char 2=6,对齐到8)= 16个字节 
再比如: 
class B{ 
Integer a; 
long b; 
byte c; 
} 
占 8(基本)+8(long8+byte1=9,对齐到8*2)+8(对象引用4,对齐到8)=32个字节 

=============== 

如果你是从别的类继承的,父类的也要算上。 

【也就是说,先把基本类型占大小全部加起来,取8的倍数;然后把所有引用占内存加起来,取8的倍数;最后把两个8的倍数值加起来就是最终对象的大小。】


这与C++不同,C++中,空对象占一个字节,有数据成员则按数据成员对齐后,得到的大小 
#include <iostream.h> 
class A 
{ 
private: 
int i; 
    char b; 
}; 

void main() 
{ 
A a; 
cout<<sizeof(a)<<endl; 
} 

得到的是8。 

【这个我没深究,不过c++空类占一个字节,如果不是空类,类本身不占字节,只需要把所有成员变量占字节加起来取8的倍数就行了。】

以上文章转自:http://329937021.iteye.com/blog/547779


但是有个网友回复如下:

“占 8(基本)+8(long8+byte1=9,对齐到8)+8(对象引用4,对齐到8)=32个字节 ” 
这句有问题吧,jvm分配内存是按照 8byte 的倍数来分配的, 
class B{ 
Integer a; 
long b; 
byte c; 
} 
大小为:空对象大小(8byte)+long大小(8byte)+byte大小(1byte)+空Integer引用的大小(4byte)=21byte 
由于要是 8byte 的倍数,所以是 24byte 
可以参照这个程序,把Te类改动一下,结果运行如下: 

'before' heap: 143560, 'after' heap: 143584 
heap delta: 24 
size = 24 bytes

【他的意思是把类中所有占字节数加起来最终取8的倍数就行了,关于这个问题也没必要深究,编译器可能不一样呢。】

LabVIEW+数据库应用系列保姆级教程,第二篇增删查改 2021-7-2 先挖好坑 阅读详情

相关推荐

C#与发那科机器人通信实战:从SDK配置到机械臂控制

本文详细介绍了如何使用C#与发那科机器人进行通信,从SDK配置到机械臂控制的完整实战流程。内容包括环境准备、通信连接建立、机械臂运动控制、异常处理与状态监控,以及高级功能实战,帮助开发者快速掌握工业机器人编程技术。

weixin_42524276的博客 457

一个Java对象和Hashmap对象占用多大内存

一个Java对象和Hashmap对象占用多大内存

u011250186的博客 2155

描述符链表(Descriptor Chain)是什么?

描述符链表是硬件加速数据传输的核心数据结构,通过链式描述符(包含地址、长度、控制标志等)实现DMA自动批量处理,显著降低CPU负载。其工作原理为:CPU初始化链表后,硬件按序处理每个描述符,完成自动跳转与中断通知。在网卡收包、NVMe存储等场景中应用广泛,优势包括批处理、低延迟和灵活调度。需注意内存对齐、缓存一致性等实现细节,优化手段包括预分配描述符池、环形缓冲区等。该技术是网络/存储领域提升吞吐量的关键方案。

guigenyi的专栏 773

JVM调优总结(二)-一些概念

  Java对象的大小     基本数据的类型的大小是固定的,这里就不多说了。对于非基本类型的Java对象,其大小就值得商榷。     在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句: Object ob = new Object();     这样在程序中完成了一个Java对象的生命,但是它所占的空间...

和你在一起 355

树莓派通过TTL3.3转485 Modbus采集水表

所需道具 树莓派0,我用的是树莓派zero wh; 具有光电直读功能的有线水表,我用的是咸鱼淘的埃美柯LXSY-20E1; TTL3.3 转 485模块,带隔离的贵些; 5V转12V升压模块。 原理 树莓派有UART(GPIO14 Tx 和 GPIO15 Rx)串口通讯功能,电器特性是3.3V TTL,直读远传水表支持M-Bus/485通讯接口,我买的光电直读水表485要求12V供电(根据仪表厂家说明书)。TTL和485虽然都是串口通讯,但电器特性不一样,不能直接接!我已经烧掉一个树莓派...

xhydongda的博客 3441

YOLOv8_obb的C++工程部署实战:从模型转换到实时视频推理

本文详细介绍了YOLOv8_obb模型在C++环境下的完整工程部署流程,涵盖从PyTorch模型到ONNX格式的转换、基于ONNX Runtime的C++推理引擎搭建、旋转框后处理解析,以及实时视频流处理与性能优化。文章重点解析了模型转换的关键参数、环境配置的常见问题、核心推理代码的实现,并提供了实用的避坑指南,旨在帮助开发者高效完成YOLOv8_obb的C++工程部署。

weixin_29100927的博客 44

Java里面一个对象到底占用多少空间

可以看到这个时候就没有额外填充4个字节了,这个UseCompressedOops意思是时否开启压缩指针,因为在java对象头里面有一个类型指针指向它所属的类型,默认情况下是开启的,这个类型指针占4个字节,那么一个默认情况下Object对象实际上只占用了12个字节,为了对齐,额外填充了4个字节,而当我们不开启指针压缩的时候,类型指针站8个字节,这个时候就不需要对齐填充了。可以看到一个Object对象占用16个字节,其中有4个字节是不属于这个对象本身的内容,是额外填充的,至于为什么要填充,

qq_17805707的博客 267

基于 Python + Flask + Echarts 的疫情监控系统

基于 Python + Flask + Echarts 的疫情监控系统

743

Java 对象内存解析(分析不同对象在JVM中占用大小和对象结构)

Java 对象内存解析(分析不同对象在JVM中占用大小和对象结构)

kerwin的博客 4350

openclaw通俗入门系列6——记忆系统

记忆 = 智能体的笔记本,分长期(MEMORY.md)和每日(memory/日期.md)。只有写到文件里的才能记住!支持语义搜索(理解意思)+ 关键词搜索,还能自动在压缩前保存重要内容。

m0_60605453的博客 403

pycharm报错cannot start the IED:Error occurred during initialization of VMagent library failed...如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 1925

一个Java对象占用多大内存

​ 这个问题一般会出现在稍微高端一点的 Java 面试环节。要求面试者不仅对 Java 基础知识熟悉,更重要的是要了解内存模型。 Java 对象模型 HotSpot JVM 使用名为 oops (Ordinary Object Pointers) 的数据结构来表示对象。这些 oops 等同于本地 C 指针。 instanceOops 是一种特殊的 oop,表示 Java 中的对象实例。 在 Hotspot VM 中,对象在内存中的存储布局分为 3 块区域: 对象头(Header) .

lonelyhiker 6740

搞定ESD(五):静电放电问题分析与调试

前面深入分析了静电放电的干扰机理、耦合路径,从现在开始将进入下一个大家非常关注的环节:静电放电问题分析与调试,掌握静电放电问题的分析方法,快速锁定敏感设备或者耦合路径,可以达到事半功倍的效果。

记得诚 2793

java获取内存中的对象_如何获取一个Java对象所占内存大小

新建一个maven工程我们先在IDEA中新建一个名为ObjectSizeFetcherAgent的maven工程,如下图:在maven项目中的pom.xml中新增一个打jar包的插件,如下:org.apache.maven.pluginsmaven-compiler-plugin3.11.81.8/src/test/**utf-8org.apache.maven.pluginsmaven-jar-...

weixin_42185419的博客 1293

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

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

JAVA——对象所占内存空间大小的计算

学过c++的朋友想必对“c++的内存对齐规则”不会感到陌生。那么在java中,是否也存在这样的规则呢?为此,笔者进行了实验,发现java的内存对齐规则非常简明——8字节对齐。现与大家分享下。 一个java对象所占的内存空间分为三个部分:对象头(Mark Word+类型指针+长度)+实例数据+填充。 填充的目的是保证一个java对象的大小是8B的整数倍。 对象头分为三个部分:Mark Word、

sky_ground的博客 4353

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java对象所占内存大小输出

计算java对象所占内存大小。

tszc95的博客 2645

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java 打印对象大小_如何获取一个Java对象所占内存大小

新建一个maven工程我们先在IDEA中新建一个名为ObjectSizeFetcherAgent的maven工程,如下图:在maven项目中的pom.xml中新增一个打jar包的插件,如下:org.apache.maven.pluginsmaven-compiler-plugin3.11.81.8/src/test/**utf-8org.apache.maven.pluginsmaven-jar-...

weixin_34619335的博客 6127

测量Java对象所占内存大小

背景: 相信大部分人都不会关注这个问题吧,只有一些偏执狂才会抓着这些不放,我们平时写代码时经常会new ArrayList<>(),new String()之类的,那么这些刚new出来的对象在内存中占用多大空间呢?随着作者一起去看看吧! 方法一设置-Xms和-Xmx的大小,然后在程序中循环new对象,直到发生OOM异常,记录下此时new了多少个对象,大家觉得这种方法可靠不?下面放上设置参数以及测试代

tianqishu11的专栏 2万+

复杂Java对象所占内存的大小

我们在Java单个对象内存布局中讲解了单个简单的Java对象所占内存的大小的计算。那么这篇文章主要是讲解复杂Java对象所占内存大小的计算,我们把继承、复合的对象称为复杂对象 继承对象 class Parent { protected int x; // 4字节 protected int y; // 4字节 protected boolean ...

aohuang8877的博客 234

Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法

System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/Runtime rt=Runtime.getRuntime( ); //获得系统的Runtime对象rtSystem.out.println("Total Memory= " + rt.totalMemory( )+//打印总内存大小" Free Memory = ...

weixin_42300167的博客 355

如何查看java对象所占内存大小

查看java对象内存,查看类占用大小

qq_44039494的博客 5769

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

本文讲述4种查看java对象所占内存大小的方法

华为云官方博客 1万+
上一篇: C# 能否获取一个对象所占内存的大小
下一篇: WPF框架剖析(从头开始自己写WPF框架)
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值