计算一个Java对象占用字节数的方法

作者:shichen2014 时间:2022-06-14 18:05:21 

本文实例讲述了如何计算(或者说,估算)一个Java对象占用的内存数量的方法。分享给大家供大家参考。具体分析如下:

通常,我们谈论的堆内存使用的前提是以“一般情况”为背景的。不包括下面两种情形:
 
某些情况下,JVM根本就没有把Object放入堆中。例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中。
被Object占用内存的大小依赖于Object的当前状态。例如:Object的同步锁是否生效,或者,Object是否正在被回收。
我们先来看看在堆中单个的Object长什么样子

计算一个Java对象占用字节数的方法

在堆中,每个对象由四个域构成(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程序设计的理解。

标签:Java,对象
0
投稿

猜你喜欢

  • C# null 合并运算符??(双问号)使用示例

    2022-12-03 02:29:19
  • Java利用HttpClient模拟POST表单操作应用及注意事项

    2023-11-29 23:48:01
  • Java详解数据类型的定义与使用

    2023-09-29 01:35:20
  • Android开发ImageView图片无法显示解决过程

    2023-06-07 21:34:39
  • java 获取当前路径下的所有xml文档的方法

    2021-08-08 13:54:29
  • Android编程之selector下设置背景属性值的方法

    2023-08-23 08:07:49
  • C#中重载与重写区别分析

    2023-11-01 17:43:05
  • Java编程实现对象克隆(复制)代码详解

    2023-02-13 10:12:31
  • Android开发之merge结合include优化布局

    2022-07-18 07:22:51
  • 详解java注解相关知识

    2022-09-22 12:32:52
  • C#随机生成Unicode类型字符串

    2023-12-05 08:42:29
  • Java项目中获取路径的绝对路径问题和相对路径问题

    2023-07-09 13:25:01
  • C#使用 NAudio 实现音频可视化的方法

    2022-10-07 09:31:58
  • Java 生成PDF文档的示例代码

    2022-10-31 17:39:10
  • Android中ListView分页加载数据功能实现

    2022-04-09 08:36:12
  • Android编程使用Fragment界面向下跳转并一级级返回的实现方法

    2021-08-20 19:56:51
  • 分析java中全面的单例模式多种实现方式

    2021-12-28 05:40:29
  • JAVA多线程知识汇总

    2021-08-03 09:04:47
  • Kotlin使用TransitionDrawable实现颜色渐变效果流程讲解

    2023-03-28 06:54:08
  • Android 应用中插入广告的实例

    2023-02-15 22:41:34
  • asp之家 软件编程 m.aspxhome.com