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

 更新时间:2015年01月13日 10:53:32   投稿:shichen2014  
这篇文章主要介绍了计算一个Java对象占用字节数的方法,较为详细的分析了Java中各类对象所占用的字节数,需要的朋友可以参考下

本文实例讲述了如何计算(或者说,估算)一个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程序设计的理解。

相关文章

  • SpringCloud之Feign代理,声明式服务调用方式

    SpringCloud之Feign代理,声明式服务调用方式

    这篇文章主要介绍了SpringCloud之Feign代理,声明式服务调用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • spring中的事务执行流程图解

    spring中的事务执行流程图解

    这篇文章主要介绍了spring中的事务执行流程图解,Spring事务是Spring框架提供的一种管理数据库事务的机制,它通过将一系列数据库操作封装在一个事务中,保证这些操作要么全部成功执行,要么全部回滚,从而确保数据的一致性和完整性,需要的朋友可以参考下
    2023-10-10
  • SpringBoot 项目添加 MDC 日志链路追踪的执行流程

    SpringBoot 项目添加 MDC 日志链路追踪的执行流程

    日志链路追踪就是将一个标志跨线程进行传递,在一般的小项目中也就是在你新起一个线程的时候,或者使用线程池执行任务的时候会用到,比如追踪一个用户请求的完整执行流程,本文给大家介绍SpringBoot MDC 日志链路追踪的代码,感兴趣的朋友一起看看吧
    2021-06-06
  • 浅析Spring的事务实现原理

    浅析Spring的事务实现原理

    这篇文章主要为大家详细介绍了Spring中事务实现的原理,文中的示例代码讲解详细,对我们学习Spring有一定的帮助,需要的可以参考一下
    2022-11-11
  • Java中Validated、Valid 、Validator区别详解

    Java中Validated、Valid 、Validator区别详解

    本文主要介绍了Java中Validated、Valid 、Validator区别,有时候面试的时候会被问到,他们的区别你知道几个,本文就来详细的介绍一下
    2021-08-08
  • Java实现Ip地址获取的示例代码

    Java实现Ip地址获取的示例代码

    这篇文章主要为大家详细介绍了Java实现Ip地址获取的两种方式,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下
    2023-09-09
  • java实现附件预览(openoffice+swftools+flexpaper)实例

    java实现附件预览(openoffice+swftools+flexpaper)实例

    本篇文章主要介绍了java实现附件预览(openoffice+swftools+flexpaper)实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2016-10-10
  • java使用异或对文件进行加密解密

    java使用异或对文件进行加密解密

    这篇文章主要为大家详细介绍了java使用异或方式对文件进行加密解密,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • Java Struts图片上传至指定文件夹并显示图片功能

    Java Struts图片上传至指定文件夹并显示图片功能

    这篇文章主要介绍了Java Struts图片上传至指定文件夹并显示图片功能,需要的朋友可以参考下
    2017-08-08
  • 在Java的Hibernate框架中对数据库数据进行查询操作

    在Java的Hibernate框架中对数据库数据进行查询操作

    这篇文章主要介绍了Java的Hibernate框架中对数据库数据进行查询操作的方法,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12

最新评论