计算一个Java对象占用字节数的方法
作者:shichen2014 时间:2022-06-14 18:05:21
本文实例讲述了如何计算(或者说,估算)一个Java对象占用的内存数量的方法。分享给大家供大家参考。具体分析如下:
通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:
某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中。
被Object占用内存的大小依赖于Object的当前状态。例如:Object的同步锁是否生效,或者,Object是否正在被回收。
我们先来看看在堆中单个的Object长什么样子
在堆中,每个对象由四个域构成(A、B、C 和 D),下面我们逐个解释一下:
A:对象头,占用很少的字节,表述Object当前状态的信息
B:基本类型域占用的空间(原生域指 int、boolean、short等)
C:引用类型域占用的空间(引用类型域指 其他对象的引用,每个引用占用4个字节)
D:填充物占用的空间(后面说明什么是填充物)
下面我们对A、B、C 和 D 逐一解释
A:对象头
内存中,每个对象占用的总空间不仅包含对象内声明的变量所需要的空间,还包括一些额外信息,比如:对象头 和 填充物。“对象头”的作用是用来记录一个对象的实例名字、ID 和 实例状态(例如,当前实例是否“可到达”,或者当前锁的状态等等)。
在当前的JVM版本中(Hotspot),“对象头”占用的字节数如下:
一个普通对象,占用8 bytes
数组,占用 12 bytes,包含普通对象的 8 bytes + 4 bytes(数组长度)
B:基本类型
boolean、byte 占用 1 byte,char、short 占用 2 bytes,int、float 占用 4 bytes,long、double 占用 8 bytes
C:引用类型
每个引用类型占用 4 bytes
D:填充物
在Hotspot中,每个对象占用的总空间是以8的倍数计算的,对象占用总空间(对象头+声明变量)不足8的倍数时候,自动补齐。而,这些被填充的空间,我们可以称它为“填充物”。我们看下具体实例:
一个空对象(没有声明任何变量)占用 8 bytes -- > 对象头 占用 8 bytes
只声明了一个boolean类型变量的类,占用 16 bytes --> 对象头(8 bytes) + boolean (1 bytes) + 填充物(7 bytes)
声明了8个boolean类型变量的类,占用 16 bytes --> 对象头(8 bytes) + boolean (1 bytes) * 8
通过上面的实例,更有助于我们加深对Java程序设计的理解。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java IO流—异常及捕获异常处理 try…catch…finally
![](https://img.aspxhome.com/file/2023/1/62401_0s.png)
java 工厂模式的实例详解
Java技巧函数方法实现二维数组遍历
![](https://img.aspxhome.com/file/2023/9/58469_0s.png)
Java常用内置注解用法分析
解决Eclipse的Servers视图中无法添加Tomcat6/Tomcat7的方法
![](https://img.aspxhome.com/file/2023/6/64806_0s.png)
Spring MVC过滤器-登录过滤的代码实现
java实现文件的断点续传
![](https://img.aspxhome.com/file/2023/4/59544_0s.jpg)
Java实例讲解动态代理
解决mybatis update并非所有字段需要更新问题
![](https://img.aspxhome.com/file/2023/9/61599_0s.jpg)
Java对象级别与类级别的同步锁synchronized语法示例
![](https://img.aspxhome.com/file/2023/7/61867_0s.png)
SpringBoot多数据源配置详细教程(JdbcTemplate、mybatis)
OpenCV实现直线拟合
![](https://img.aspxhome.com/file/2023/4/92494_0s.jpg)
Flutter 状态管理的实现
![](https://img.aspxhome.com/file/2023/0/108330_0s.png)
springboot项目启动慢的问题排查方式
![](https://img.aspxhome.com/file/2023/0/57590_0s.png)
一篇文章带你入门Java Script
Spring Boot统一异常处理最佳实践(拓展篇)
![](https://img.aspxhome.com/file/2023/6/61126_0s.png)
Java面向对象编程的三大特征
![](https://img.aspxhome.com/file/2023/8/58478_0s.png)
java中使用zxing批量生成二维码立牌
![](https://img.aspxhome.com/file/2023/1/64371_0s.png)
Android Handler消息机制分析
![](https://img.aspxhome.com/file/2023/8/87268_0s.jpg)
Flutter 使用fluro的转场动画进行页面切换
![](https://img.aspxhome.com/file/2023/4/94964_0s.gif)