一个HashMap对象所占内存的分析
Map<Object, Object> map = new HashMap<>();
日常写代码中,可能都不会关注这一行代码占了多少个内存,今天我们就来分析一下。
首先,map是一个对象,而java对象包含了三个部分:
- 对象头
- 实例数据
- 对齐填充字节
对象内存分析
java对象头
我们先来看看对象头,对象头中也分为了三部分:
- Mark Word
- class pointer
- array length(只有数组对象才有)
我们目前只考虑在64位下并默认开启压缩的情况下的内存,map对象不属于数组对象,即只包括了8bytes的Mark Word和4bytes的class pointer,所以对象头总共包含了12bytes。
实例数据
实例数据包括自身的实例数据以及所有父类对象的实例字段:
首先我们看一下HashMap继承的父类AbstractMap源码中,里面的实例字段:
transient Set<K> keySet;
transient Collection<V> values;
看一下HashMap源码的实例字段:
/* ---------------- Fields -------------- *//*** The table, initialized on first use, and resized as* necessary. When allocated, length is always a power of two.* (We also tolerate length zero in some operations to allow* bootstrapping mechanics that are currently not needed.)*/transient Node<K,V>[] table;/*** Holds cached entrySet(). Note that AbstractMap fields are used* for keySet() and values().*/transient Set<Map.Entry<K,V>> entrySet;/*** The number of key-value mappings contained in this map.*/transient int size;/*** The number of times this HashMap has been structurally modified* Structural modifications are those that change the number of mappings in* the HashMap or otherwise modify its internal structure (e.g.,* rehash). This field is used to make iterators on Collection-views of* the HashMap fail-fast. (See ConcurrentModificationException).*/transient int modCount;/*** The next size value at which to resize (capacity * load factor).** @serial*/// (The javadoc description is true upon serialization.// Additionally, if the table array has not been allocated, this// field holds the initial array capacity, or zero signifying// DEFAULT_INITIAL_CAPACITY.)int threshold;/*** The load factor for the hash table.** @serial*/final float loadFactor;
由以上源码可以知道,有4个引用字段,3个int类型字段,1个float字段;引用类型占4个字节,int类型占4个字节,float类型占4个字节;可以算出,一个HashMap对象的实例数据占32个字节。
对齐填充
JVM要求对象内存大小必须是8bytes的倍数,综上所述对象头12bytes加上实例数据32bytes,总共44bytes,填充4bytes,所以最后得出结论,一个HashMap对象所占内存为48bytes。
结论
一个HashMap对象所占内存为48bytes。
一个HashMap对象所占内存的分析相关推荐
- 1 OC 对象的本质(一个NSObject 对象占用的内存大小)
1 前言 目录 1 前言 2 一个NSObject占用多少内存 3 为什么呢 ? 4 如何在内存中看呢? OC 的面向对象都是基于C/C++ 的数据结构实现的 结构体 2 clang 命令转换成c++ ...
- java map存放班级和姓名_Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...
|--需求说明 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entry里面 ...
- String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小
String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小 参考文章: (1)String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小 (2)https: ...
- Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...
|--需求说明 如题 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entr ...
- 一个Java对象到底占多大内存?(转)
最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...
- 解析一个Java对象占用多少内存空间
说明: alignment, 对齐, 比如8字节的数据类型long, 在内存中的起始地址必须是8的整数倍. padding, 补齐; 在对象所占据空间的末尾,如果有空白, 需要使用padding来补齐 ...
- 如何计算Java对象所占内存的大小
摘要 本文以如何计算Java对象占用内存大小为切入点,在讨论计算Java对象占用堆内存大小的方法的基础上,详细讨论了Java对象头格式并结合JDK源码对对象头中的协议字段做了介绍,涉及内存模型.锁原理 ...
- C# CLR 聊聊对象的内存布局 一个空对象占用多少内存
在 C# 中的对象大概可以分为三个不同的类型,包括值类型.引用类型和其他类型.本文主要讨论的是引用类型对内存空间的占用情况.在讨论开始之前我想问问大家,一个空的对象会占用多少内存空间?当然这个问题本身 ...
- Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法
System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/ Runtime rt=Runtime.get ...
最新文章
- 数学仍然是人类的“火炬”
- vsftpd匿名用户上传和下载的配置
- Android应用开发 led 驱动层 hal硬件抽象层 应用层 详细教程记录(含源码)
- powershell 常用命令笔记
- TeamCity : 安装 Server
- python灰度图生成g代码_Python打造一个在线G代码生成器
- Spring学习总结(8)——25个经典的Spring面试问答
- linux mtime参数,linux find mtime参数详解
- 区块链 以太坊 虚拟机 EVM 详解
- 终极解决maya渲染层丢材质,变线框等问题
- 机械革命bios升级_¥1500买6年前神舟老战神,3内存+4硬盘升级潜力强,鲁大师15万!...
- POJ 3295.Tautology
- 【机器学习】【特征选择】4.嵌入法Embedded
- HuffMan编码C语言实现
- Java操作word指定位置插入数据
- HTML制作色带,色带用尼龙带及色带的制作方法
- 哪些行业可以申请高新技术企业?
- 一文搞懂高速CAN收发器TJA1145
- [Pycharm] 取消被excluded的文件夹
- SLsec招新题wp