如何计算Java对象的大小
一个对象通常由头和内容组成。想要计算一个对象的大小,我们就需要分别计算头部的大小和内容的大小。
查看一个对象的大小
首先在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对象的大小相关推荐
- 如何计算Java对象所占内存的大小
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型.锁原理 ...
- JVM概念之Java对象的大小与引用类型
2019独角兽企业重金招聘Python工程师标准>>> 本文来自和你在一起的博客,原文标题:<JVM调优总结(二)-一些概念>.本文总结了JVM概念中的Java对象的大小 ...
- java统计空间占用_JVM —— Java 对象占用空间大小计算
引用类型(reference type: Integer)在 32 位系统上每一个占用 4bytes(即32bit, 才干管理 2^32=4G 的内存), 在 64 位系统上每一个占用 8bytes( ...
- JVM —— Java 对象占用空间大小计算
零. 为什么要知道 Java 对象占用空间大小 缓存的实现: 在设计 JVM 内缓存时(不是借助 Memcached. Redis 等), 需要知道缓存的对象是否会超过 JVM 最大堆限制, 如果会超 ...
- http://www.dewen.net.cn/q/6120/如何获取Java对象的大小
http://www.dewen.net.cn/q/6120/如何获取Java对象的大小 kenvi 1 票 kenvi 2078 在C或者C++里经常会通过sizeof来计算一个对象所占空间的大小, ...
- 如何计算java对象大小
背景 目前我们系统的业务代码中大量使用了LocalCache的方式做本地缓存,而且cache的maxSize通常设的比较大,比如10000.我们的业务系统中就使用了size为10000的15个本地缓存 ...
- 如何查看java对象的大小
有时需要查看java对象占用了多少内存(对象大小),lucene为我们提供了一个很好的工具类,操作简单,如下: int[] s = new int[1024];System.out.println(& ...
- Java对象内存大小计算
背景 今天办公室两个人事妹子因为一道Java试题各持己见,誓死捍卫自己的答案(对,是HR没错 -- 程序猿快没活路了). 题:字符串 "7天学会JAVA" 占用的内存空间是 ( ) ...
- 使用JOL工具计算Java对象的大小
注意:本文默认环境为 64 位操作系统,JDK 为 1.8,JVM 为 HotSpot. 工具 JOL全称为Java Object Layout,是用来分析JVM中对象布局的工具,可以在运行时计算某个 ...
最新文章
- .net mvc actionresult 返回字符串_.NET架构师知识普及
- 23. Spring Boot启动加载数据CommandLineRunner【从零开始学Spring Boot】
- stm32怎么调用for循环内部的变量_循环中的异步amp;amp;循环中的闭包
- python制作的游戏如何转化为swf_从纯Python中的Flash文件(.swf)获取维度
- AJAX实现导航式多条件搜索
- 如何成为一个技术全面的架构师
- 事件冒泡、事件捕获、事件委托
- 分析微信小程序生成二维码接口报错41030: invalid page hint
- ubuntu下安装QQ
- 打造Linux三流娱乐环境,二流办公环境,一流Java开发环境
- 打砖块游戏源文件_大家无聊的话不如来玩玩这些小游戏
- 如何用乐高积木式操作让 ChatGPT 变得更强大?
- U盘插上,系统有反应,但是却不识别,电脑能识别其他的U盘,U盘在其他电脑也是好用的经验分享(驱动问题)
- EXPLAIN各个字段是什么意思
- Intel® oneAPI Base Toolkit+Intel® oneAPI HPC Toolkit安装教程
- svm公式推导及理解
- 源码角度详解Redis缓存淘汰机制(Eviction)
- 什么是rest?什么是restful?它们之间是什么关系
- APICloud入门
- 显卡显存测试u盘 mats_影驰RTX 2080 Ti HOF Plus显卡评测:披坚执锐的性能王冠守护者...
热门文章
- 项目管理之项目干系人
- [论文阅读]Spatio-Temporal Graph Routing for Skeleton-Based Action Recognition
- mac装linux iso不用u盘安装,在任何mac上用u盘安装OSX和Windows10双系统的方法(支持老电脑、不用Bootcamp)...
- MacBook Pro USB口可以识别U盘却不能识别手机?
- 检测样本分布是不是正态分布,绘制其正态分布概率图及异常值检测-python代码实现
- html5带拖拽上传的图片gallary
- ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet-3-01:BootLoader+Application的开发模式
- 瞬时频率函数matlab,Hilbert 变换与瞬时频率
- cesium给广告牌加动图
- 动态效果网页HTML+CSS+JS