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. 1 OC 对象的本质(一个NSObject 对象占用的内存大小)

    1 前言 目录 1 前言 2 一个NSObject占用多少内存 3 为什么呢 ? 4 如何在内存中看呢? OC 的面向对象都是基于C/C++ 的数据结构实现的 结构体 2 clang 命令转换成c++ ...

  2. java map存放班级和姓名_Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...

    |--需求说明 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entry里面 ...

  3. String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小

    String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小 参考文章: (1)String引起的OutOfMemory异常 + 如何计算C#对象所占内存的大小 (2)https: ...

  4. Java 创建一个HashMap对象,并在其中添加学生的姓名和成绩,键为学生姓名,值为学生成绩,使用增强for循环遍历该HashMap,并输出学生成绩。...

    |--需求说明 如题 |--实现思路 1.使用map.containsKey()判断输入的姓名在不在map里面,如果在就打印 2.遍历全班姓名和成绩,需要创建Map.entry,然后在map.entr ...

  5. 一个Java对象到底占多大内存?(转)

    最近在读<深入理解Java虚拟机>,对Java对象的内存布局有了进一步的认识,于是脑子里自然而然就有一个很普通的问题,就是一个Java对象到底占用多大内存? 在网上搜到了一篇博客讲的非常好 ...

  6. 解析一个Java对象占用多少内存空间

    说明: alignment, 对齐, 比如8字节的数据类型long, 在内存中的起始地址必须是8的整数倍. padding, 补齐; 在对象所占据空间的末尾,如果有空白, 需要使用padding来补齐 ...

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

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

  8. C# CLR 聊聊对象的内存布局 一个空对象占用多少内存

    在 C# 中的对象大概可以分为三个不同的类型,包括值类型.引用类型和其他类型.本文主要讨论的是引用类型对内存空间的占用情况.在讨论开始之前我想问问大家,一个空的对象会占用多少内存空间?当然这个问题本身 ...

  9. Java计算一个对象所占内存大小_Java程序计算各种对象所占内存的大小的方法

    System.out.println("--- Memory Usage:"); /*打印一行字符串---Memory Usage*/ Runtime rt=Runtime.get ...

最新文章

  1. 数学仍然是人类的“火炬”
  2. vsftpd匿名用户上传和下载的配置
  3. Android应用开发 led 驱动层 hal硬件抽象层 应用层 详细教程记录(含源码)
  4. powershell 常用命令笔记
  5. TeamCity : 安装 Server
  6. python灰度图生成g代码_Python打造一个在线G代码生成器
  7. Spring学习总结(8)——25个经典的Spring面试问答
  8. linux mtime参数,linux find mtime参数详解
  9. 区块链 以太坊 虚拟机 EVM 详解
  10. 终极解决maya渲染层丢材质,变线框等问题
  11. 机械革命bios升级_¥1500买6年前神舟老战神,3内存+4硬盘升级潜力强,鲁大师15万!...
  12. POJ 3295.Tautology
  13. 【机器学习】【特征选择】4.嵌入法Embedded
  14. HuffMan编码C语言实现
  15. Java操作word指定位置插入数据
  16. HTML制作色带,色带用尼龙带及色带的制作方法
  17. 哪些行业可以申请高新技术企业?
  18. 一文搞懂高速CAN收发器TJA1145
  19. [Pycharm] 取消被excluded的文件夹
  20. SLsec招新题wp

热门文章

  1. 配置华为防火墙NAT功能
  2. MySQL sum()函数
  3. charles的简单使用
  4. C语言-如何将用户输入的金额数字转换成中文大写?
  5. html5悬浮圆圈背景动画特效,html5圆圈浮动背景动画特效
  6. 史上最详细的小程序测试用例模板,以后再也不怕测试用例不会写了
  7. 测试用例是什么?怎么写?最好实用的测试用例
  8. 数据库SQL实战-- 获取员工其当前的薪水比其manager当前薪水还高的相关信息
  9. 非常详细易懂的法线贴图(Normal Mapping)
  10. 闲聊JavaScript