一个对象通常由头和内容组成。想要计算一个对象的大小,我们就需要分别计算头部的大小和内容的大小。

查看一个对象的大小

首先在pom文件中引入apache下面的lucene-core依赖,然后调用对应的shallowSizeOf()方法。

<dependency><groupId>org.apache.lucene</groupId><artifactId>lucene-core</artifactId><version>6.6.1</version>
</dependency>
public class Test {public static void main(String[] args) {Integer integer = new Integer(10);System.out.println(RamUsageEstimator.shallowSizeOf(integer));  //结果为16}
}

可以看到Integer对象的大小是16个字节。

头部大小

对象的头通常会存储该对象地址标记(里面存储有该对象的锁,hashcode,年龄等信息)等信息。其中,地址会占用4个字节,标记会占用8个字节。也就是说,一个对象的头部默认会占用4+8=12个字节。另外,如果该对象是一个数组的话,头部还需要额外的4个字节来存储该数组的长度(因为JVM使用一个int类型的变量来记录数组的长度,而int类型长度为4个字节)。也就是说,对于一个数组对象的话,它的头部会占用4+8+4=16个字节。

内容大小

为了计算内容大小,我们需要查看该对象的类内部的方法和变量。以上面的Integer对象为例,进入其代码中我们可以看到大部分的变量都是用static来修饰的,这样的变量会被存在方法区,并不算做Java对象的大小。除此之外,类的方法也是存储在方法区的,也不会被计算。

而该Integer对象的值是用int变量来存储的,并没有用static修饰,这意味着value变量将占用4个字节。

因此,一个Integer对象的大小就是4+8+4=16个字节,这也和上面程序输出的大小一致。

注意点

需要注意的是,由于Java的存储是以8字节为单位扩展的,所以Java的对象的大小都是8字节的整数倍。如果头部+内容的大小不是8的倍数,将自动补充为8字节的整数倍。如Hashmap占用48个字节,但是实际上看代码Hashmap只占用了44个字节,这就是因为44字节自动填充为了48字节。

如何计算Java对象的大小相关推荐

  1. 如何计算Java对象所占内存的大小

    摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型.锁原理 ...

  2. JVM概念之Java对象的大小与引用类型

    2019独角兽企业重金招聘Python工程师标准>>> 本文来自和你在一起的博客,原文标题:<JVM调优总结(二)-一些概念>.本文总结了JVM概念中的Java对象的大小 ...

  3. java统计空间占用_JVM —— Java 对象占用空间大小计算

    引用类型(reference type: Integer)在 32 位系统上每一个占用 4bytes(即32bit, 才干管理 2^32=4G 的内存), 在 64 位系统上每一个占用 8bytes( ...

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

    零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超 ...

  5. http://www.dewen.net.cn/q/6120/如何获取Java对象的大小

    http://www.dewen.net.cn/q/6120/如何获取Java对象的大小 kenvi 1 票 kenvi 2078 在C或者C++里经常会通过sizeof来计算一个对象所占空间的大小, ...

  6. 如何计算java对象大小

    背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000.我们的业务系统中就使用了size为10000的15个本地缓存 ...

  7. 如何查看java对象的大小

    有时需要查看java对象占用了多少内存(对象大小),lucene为我们提供了一个很好的工具类,操作简单,如下: int[] s = new int[1024];System.out.println(& ...

  8. Java对象内存大小计算

    背景 今天办公室两个人事妹子因为一道Java试题各持己见,誓死捍卫自己的答案(对,是HR没错 -- 程序猿快没活路了). 题:字符串 "7天学会JAVA" 占用的内存空间是 ( ) ...

  9. 使用JOL工具计算Java对象的大小

    注意:本文默认环境为 64 位操作系统,JDK 为 1.8,JVM 为 HotSpot. 工具 JOL全称为Java Object Layout,是用来分析JVM中对象布局的工具,可以在运行时计算某个 ...

最新文章

  1. .net mvc actionresult 返回字符串_.NET架构师知识普及
  2. 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
  3. stm32怎么调用for循环内部的变量_循环中的异步amp;amp;循环中的闭包
  4. python制作的游戏如何转化为swf_从纯Python中的Flash文件(.swf)获取维度
  5. AJAX实现导航式多条件搜索
  6. 如何成为一个技术全面的架构师
  7. 事件冒泡、事件捕获、事件委托
  8. 分析微信小程序生成二维码接口报错41030: invalid page hint
  9. ubuntu下安装QQ
  10. 打造Linux三流娱乐环境,二流办公环境,一流Java开发环境
  11. 打砖块游戏源文件_大家无聊的话不如来玩玩这些小游戏
  12. 如何用乐高积木式操作让 ChatGPT 变得更强大?
  13. U盘插上,系统有反应,但是却不识别,电脑能识别其他的U盘,U盘在其他电脑也是好用的经验分享(驱动问题)
  14. EXPLAIN各个字段是什么意思
  15. Intel® oneAPI Base Toolkit+Intel® oneAPI HPC Toolkit安装教程
  16. svm公式推导及理解
  17. 源码角度详解Redis缓存淘汰机制(Eviction)
  18. 什么是rest?什么是restful?它们之间是什么关系
  19. APICloud入门
  20. 显卡显存测试u盘 mats_影驰RTX 2080 Ti HOF Plus显卡评测:披坚执锐的性能王冠守护者...

热门文章

  1. 项目管理之项目干系人
  2. [论文阅读]Spatio-Temporal Graph Routing for Skeleton-Based Action Recognition
  3. mac装linux iso不用u盘安装,在任何mac上用u盘安装OSX和Windows10双系统的方法(支持老电脑、不用Bootcamp)...
  4. MacBook Pro USB口可以识别U盘却不能识别手机?
  5. 检测样本分布是不是正态分布,绘制其正态分布概率图及异常值检测-python代码实现
  6. html5带拖拽上传的图片gallary
  7. ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-3-01:BootLoader+Application的开发模式
  8. 瞬时频率函数matlab,Hilbert 变换与瞬时频率
  9. cesium给广告牌加动图
  10. 动态效果网页HTML+CSS+JS