哈希映射内存开销

2024-01-31

我正在研究哈希图的内部结构,其中我遇到了以下详细信息:

  • 实现是一个 HashMap$Entry 对象数组:

  • 每个 HashMap$Entry 包含: – int KeyHash – 下一个对象 – 对象键 – 对象值

  • 默认容量为 16 个条目

  • 空大小为 128 字节

  • HashMap 的开销为 48 字节,再加上 (16 + (条目 * 4 字节)) array – 加上 HashMap$Entry 对象的开销

  • 每个键↔值条目的额外 32 字节 HashMap 的开销为
    因此: – 48 字节,加上每个条目 36 字节

谁能解释一下吗“HashMap 的开销为 48 字节,再加上 (16 + (条目 * 4 字节)) 大批” and “每个键↔值条目的额外 32 字节 HashMap 的开销为
因此: – 48 字节,加上每个条目 36 字节”
???

我无法理解这些结论是如何得出的,即我们如何得出有关哈希映射的最终内存详细信息。


您可能想阅读这个问题。 https://stackoverflow.com/questions/258120/what-is-the-memory-consumption-of-an-object-in-java不同的 CPU 架构、VM 实现以及不同的 Java 版本之间的对象开销会有所不同(例如 OOPS,也有以下建议)fixnums https://blogs.oracle.com/jrose/entry/fixnums_in_the_vm etc.).

但让我们 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/AbstractMap.java 亲眼看看 http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/HashMap.java对于 OpenJDK 7,HashMap class:


开销为 48 字节HashMap

家政信息。大概是8个字节。

实施中的三个字段持有以下观点:keySet(), values() and entrySet()方法。三分球,就是12 bytes在 32 位机器上。

// from AbstractMap
transient volatile Set<K>        keySet = null;
transient volatile Collection<V> values = null;

// from HashMap
private transient Set<Map.Entry<K,V>> entrySet = null

有三种int字段:size, threshold and modCount. 12 字节。

有一个float field: loadFactor. 4 bytes.

表指针本身(Entry[] table). 4 bytes.

(the static final字段不算数,它们是编译时常量)

一切给予我们的40 bytes的固定成本HashMap实例。它不是 48 字节,我不知道为什么。也许我错过了一些东西,也许你的文字提到了其他版本。这些事情有时会发生一些变化。过去可能有一个额外的字段。也许它被从 40 字节填充到 48 字节(但不应该)。


数组为 16 +(条目 * 4 字节)

The Entry[] table当表被实例化时HashMap被构造出来了,我们也需要对其进行计数。

实例化数组需要8 bytes内务管理数据,4 bytes为了length财产。那是12 bytes,而不是 16。同样,不知道它来自哪里。

每个条目都是一个指向Entry对象,所以就是4 bytes每个条目。那很简单。


每个键 ↔ 值条目额外 32 个字节

Again, 8 bytes家政服务。

现在,字段:

final K key;    // a reference, 4 bytes
V value;        // a reference, 4 bytes
Entry<K,V> next;  // a reference, 4 bytes
final int hash; // an integer primitive, 4 bytes

16字节。

这是最终的计数24 bytes每个条目。再说一遍,这不是 36。


我不知道你得到的数字是从哪里来的。那可能是 IBM 虚拟机吗?那可能是 64 位操作系统吗?也许现在的内务信息是 16 个字节(Java 8 会改变什么吗?)。

无论如何,我尝试根据我所知计算内存消耗。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哈希映射内存开销 的相关文章

随机推荐

  • 如何正确授权对 Google Cloud Storage API 的请求?

    我正在尝试使用 Google Cloud Storage JSON API 通过 http 调用从存储桶中检索文件 我从与存储桶相同的项目中的 GCE 容器中进行卷曲 并且服务帐户具有对该存储桶的读取访问权限 以下是请求的模式 https
  • java.lang.NoSuchMethodError:没有为 HttpClientResponse 执行虚拟方法

    当我在启动后尝试运行该应用程序时 它在 logcat 中显示异常 如下所示 java lang NoSuchMethodError No virtual method execute Lorg apache http client meth
  • 显示和隐藏 Windows 10 屏幕键盘 (osk.exe) 时遇到问题

    我一直在尝试获取屏幕键盘 osk exe 在 Windows 10 上从我的应用程序中出现 和消失 我的应用程序在 Windows 7 中运行良好 ShellExecute on osk exe会在那里显示键盘 但尝试在 Windows 1
  • 确定字符串是否是有效的地理位置

    我有一堆 位置 有些是准确的 哈博罗内 博茨瓦纳 有些是地理编码 40 75 73 997 有些是完全无用的 siliconcape 我需要找到一种方法来运行列表并确定每个字符串和地理编码的城市和国家 地区 并为无效位置返回空值 是否有某种
  • RequireJS:多个 main.js?

    我一直在使用 requireJS 构建一个单页应用程序 到目前为止我很喜欢它 我已经到了在主应用程序之外开发网站其他部分的阶段 但我不太确定如何 或是否 为此使用 requireJS 在我的主应用程序中 一切都是由这个脚本标签触发的
  • python 字典理解如何与内部的 lambda 函数一起工作

    我的目标是使用以下方法聚合 pandas DataFrameGroupBy 对象agg https pandas pydata org pandas docs stable reference api pandas core groupby
  • 组合器可以处理多个映射器的结果吗?

    如果在同一个节点上执行多个映射器 combiner 会合并多个映射器的结果吗 我在文档或书籍中找不到这个问题的答案 我可以找到的组合器示例似乎都产生了影响 即使它只能聚合来自一个映射器的结果 来自雅虎的Hadoop教程 http devel
  • 实体框架 DataContext 问题 - 它是否在我的控制器中得到正确处理?

    我已经收到了一些代码 并且在控制器类中有一个属性保存初始化的数据库上下文 public class MyController Controller protected AssetManagerContext db new AssetMana
  • 传播不可迭代实例的无效尝试

    将不胜感激这里的任何帮助 我有这段代码 每当表单字段收到更改时都会尝试更新我的状态 这在以前版本的 React 中工作得很好 但升级到最新版本后 我收到错误 传播不可迭代实例的尝试无效 我知道我需要使我的国家正常化 我计划这样做 然而 这将
  • ubuntu下gcc 4.5安装问题

    我尝试在 ubuntu 10 04 上安装 gcc 4 5 但失败了 这是一个编译错误 我不知道如何解决 有没有人在ubuntu上成功安装最新的gcc 以下是我的步骤和错误信息 我想知道问题出在哪里 第一步 下载这些文件 gcc core
  • 将 kml 多边形转换为 svg 路径

    我有一个带有地标的 KML 文件 每个地标都有多边形坐标 我想根据我从 json 文件读取的值动态更改多边形的填充颜色 我的理解是谷歌缓存了kml文件 所以你不能轻易地动态改变多边形的填充颜色 所以我试图将我的 kml 多边形转换为 svg
  • 右单撇号与撇号?

    右单引号 U 2019 与 撇号 U 0027 这两个角色有什么区别 我遇到了这个问题 我使用 CAtlString 从资源文件加载字符串 在某些 Windows 安装上 当尝试加载包含 U 2019 的字符串时 LoadString 失败
  • 兼容类型与严格别名规则

    将一种类型转换为另一种类型是 C 中的常见策略 这依赖于 C 结构体的布局具有一定的保证这一事实 GLib等库依靠它来实现类似继承的面向对象 基本上 struct Base int x int y struct Derived struct
  • 在 WordPress 中使用 jQuery UI 对话框

    我知道至少还有另外一篇文章处理这个问题 但答案从未明确给出 我正在 head php 文档中的 WP 子主题中工作 我在头部添加了这个
  • mgm 包中的estimateNetwork 函数存在问题

    我正在尝试使用 mgm 包运行混合图形模型 到目前为止 这是我的代码 我在最后一个命令周围加了星号 这是我似乎无法运行的命令 有人可以建议吗 library haven gt flordiss lt read sav C Users sch
  • 将不应提交的 Gradle 配置(即凭据)放在哪里?

    我正在尝试将 Gradle 构建的工件部署到 Maven 存储库 并且我需要为此指定凭据 目前这工作正常 uploadArchives repositories mavenDeployer repository url http nexus
  • 如何中断 R 中的 RPostgresql 查询

    在 RPostgresql 中中断长时间运行的查询的最佳方法是什么 例如 我想查看表格的前 10 行 并打算输入 dbGetQuery con select from big table limit 10 但有时我会忽略 限制 10 然后我
  • Rails、Ruby 1.9.3p0 和 mysql gem

    我正在运行 CentOS6 并从源代码安装了 Ruby 以及 Rails 和其他一些人员 ruby v ruby 1 9 3p0 2011 10 30 revision 33570 x86 64 linux rails v Rails 3
  • 什么时候应该使用封装? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在完成 Sun Oracle 的踪迹 http docs oracle com javase tutorial java TOC html
  • 哈希映射内存开销

    我正在研究哈希图的内部结构 其中我遇到了以下详细信息 实现是一个 HashMap Entry 对象数组 每个 HashMap Entry 包含 int KeyHash 下一个对象 对象键 对象值 默认容量为 16 个条目 空大小为 128