Java中如何计算HashMap内存使用量?

2023-12-01

我在面试中被要求计算内存使用情况HashMap如果其中有 200 万个项目,预计会消耗多少内存。

例如:

Map <String,List<String>> mp=new HashMap <String,List<String>>();

映射是这样的。

key   value
----- ---------------------------
abc   ['hello','how']
abz   ['hello','how','are','you']

我如何估计Java中这个HashMap对象的内存使用量?


简短的回答

为了找出一个对象有多大,我会使用探查器。例如,在 YourKit 中,您可以搜索对象,然后获取它来计算其深度大小。这将使您清楚地了解如果对象是独立的并且是对象的保守大小,则将使用多少内存。

狡辩

如果对象的一部分在其他结构中重复使用,例如字符串文字,您不会通过丢弃它来释放这么多内存。事实上,丢弃对 HashMap 的一个引用可能根本不会释放任何内存。

序列化怎么样?

序列化对象是获得估计值的一种方法,但由于序列化开销和编码在内存和字节流中不同,因此可能会出现很大的偏差。使用多少内存取决于 JVM(以及是否使用 32/64 位引用),但序列化格式始终相同。

e.g.

在Sun/Oracle的JVM中,一个Integer可以占用16个字节的头部,4个字节的数字和4个字节的填充(对象在内存中是8字节对齐的),总共24个字节。但是,如果序列化一个整数,则需要 81 个字节,序列化两个整数则需要 91 个字节。即第一个整数的大小被夸大,第二个整数小于内存中使用的大小。

字符串是一个更复杂的例子。在Sun/Oracle JVM中,它包含3个int价值观和char[]参考。所以你可能会假设它使用 16 字节标头加上 3 * 4 字节作为ints,4个字节char[],16字节的开销char[]然后每个字符两个字节,与 8 字节边界对齐......

哪些标志可以改变大小?

如果您有 64 位参考,char[]引用的长度为 8 个字节,因此需要 4 个字节的填充。如果您有 64 位 JVM,则可以使用+XX:+UseCompressedOops使用 32 位引用。 (因此,仅查看 JVM 位大小并不能告诉您其引用的大小)

如果你有-XX:+UseCompressedStrings,JVM 将尽可能使用 byte[] 而不是 char 数组。这可能会稍微减慢您的应用程序的速度,但可能会显着改善您的内存消耗。当使用 byte[] 时,每个字符消耗 1 个字节的内存。 ;) 注意:对于 4 字符字符串,如示例中所示,由于 8 字节边界,使用的大小是相同的。

你所说的“尺寸”是什么意思?

正如已经指出的,HashMap 和 List 更复杂,因为许多(如果不是全部)字符串可以重用,可能是字符串文字。 “大小”的含义取决于它的使用方式。即该结构单独使用多少内存?如果丢弃该结构,将释放多少资源?如果复制该结构会使用多少内存?这些问题可以有不同的答案。

没有分析器你能做什么?

如果您可以确定可能的保守尺寸足够小,则确切的尺寸并不重要。保守的情况可能是从头开始构建每个字符串和条目。 (我只是说可能,因为 HashMap 即使是空的,也可以容纳 10 亿个条目。具有单个字符的字符串可以是具有 20 亿个字符的字符串的子字符串)

您可以执行 System.gc(),获取可用内存,创建对象,执行另一个 System.gc() 并查看可用内存减少了多少。您可能需要多次创建该对象并取平均值。多次重复这个练习,但它可以给你一个公平的想法。

(顺便说一句,虽然 System.gc() 只是一个提示,但 Sun/Oracle JVM 默认情况下每次都会执行一次 Full GC)

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

Java中如何计算HashMap内存使用量? 的相关文章

  • Java new Date() 打印

    刚刚学习 Java 我知道这可能听起来很愚蠢 但我不得不问 System out print new Date 我知道参数中的任何内容都会转换为字符串 最终值是 new Date 返回对 Date 对象的引用 那么它是如何打印这个的呢 Mo
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 在 HTTPResponse Android 中跟踪重定向

    我需要遵循 HTTPost 给我的重定向 当我发出 HTTP post 并尝试读取响应时 我得到重定向页面 html 我怎样才能解决这个问题 代码 public void parseDoc final HttpParams params n
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 在两个活动之间传输数据[重复]

    这个问题在这里已经有答案了 我正在尝试在两个不同的活动之间发送和接收数据 我在这个网站上看到了一些其他问题 但没有任何问题涉及保留头等舱的状态 例如 如果我想从 A 类发送一个整数 X 到 B 类 然后对整数 X 进行一些操作 然后将其发送
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • Python 2 中的整数数组输入

    我是Python新手 我想获取 2 个大小为 4 的整数数组 a 和 b 的用户输入并打印它们 输入应该以空格分隔 第一个用户应该像这样输入数组 a 1 2 3 4 他应该像这样输入数组 b 2 3 4 6 程序应该将 a 和 b 显示为输
  • 优化我的模拟数据库的代码

    我一直在写一个程序 模拟一个小型数据库 可以在其中进行查询 写完代码后 我已经执行了它 但性能相当糟糕 它的工作速度真的很慢 我尝试过改进它 但几个月前我就开始自学C 所以我的知识还很低 所以我想找到一种解决方案来提高性能 让我解释一下我的
  • 选择 pandas 列时出现 KeyError

    我正在尝试将 CSV 文件读入 pandas 数据帧并选择一列 但不断出现关键错误 文件读入成功 我可以在 iPython 笔记本中查看数据帧 但是当我想选择第一列以外的任何列时 它会引发关键错误 我正在使用这段代码 import pand
  • JPA ManyToMany Join Table 的所有属性均为 PK

    我正在使用 Hibernate 3 3 1 并遵循建模这个示例表结构 但我在创建具有额外属性的连接表时遇到问题 这是多对多的关系Order and Product桌子 连接表是Order Detail桌子 我遵循了提到的方法here 现在我
  • 以编程方式导航到另一个视图控制器/场景

    从第一个视图控制器导航到第二个视图控制器时收到错误消息 我的编码是这样的 let vc LoginViewController nibName LoginViewController bundle nil self navigationCo
  • “惯用的”哈斯克尔型不等式

    从上一个问题编辑 我认为下面的代码不起作用 我希望实现一个 haskell 函数 f 它有一个限制 即它的 2 个参数不能具有相同的类型 我使用了以下代码 LANGUAGE MultiParamTypeClasses FunctionalD
  • 使用 contains 的 Linq 查询不起作用

    我想在 LINQ 中使用查询并使用类似于 TSQL 中 LIKE 的函数 例如 SELECT salary FROM employees WHERE last name LIKE R 我正在尝试在 LINQ to Oracle DB 中进行
  • 如何让android模拟器访问我的电脑文件?

    谁能告诉我如何让 android 模拟器访问我电脑的媒体文件 我不知道如何在两者之间建立连接 请帮助我 提前致谢 您可以查看这篇文章 了解有关将文件从 PC 推送到 Android 模拟器的信息 如何将文件导入Android模拟器上的SD卡
  • 让 FEST 等待应用程序加载

    我是基于 FEST 的 GUI 测试的新手 MyFrame 是我的应用程序的根类 Before public void onSetUp MyFrame frame GuiActionRunner execute new GuiQuery
  • “./”(点斜线)在 HTML 文件路径位置中指什么?

    I know 意思是走上一条路 但是什么意思 确切的意思是 我最近正在浏览一个教程 它似乎只是指同一位置的一个文件 所以有必要吗 如果这就是它所做的一切 我可以不使用它吗 表示当前驱动器的根目录 表示当前目录 表示当前目录的父目录
  • tabbar-mode 使编辑变得缓慢停止

    我今天尝试了 tabbar mode 版本 2 0 1 可以通过 marmelade elpa 存储库获得 版本 2 0 来自多尔姆斯 github 存储库 当标签栏模式被激活时 击键明显滞后 我想说 gt 1 秒 我使用 emacs 24
  • 在 ReduxReducer 中执行 Ajax 获取?

    我正在尝试访问 Redux actionCreators 内的状态 相反 执行了以下操作 在减速器中执行ajax操作 为什么我需要为此访问状态 因为我想使用存储在状态中的 CSRF 令牌来执行 ajax 有人可以告诉我以下是否被认为是不好的
  • 如何在java中将UTF-16转换为UTF-32?

    我一直在寻找解决方案 但似乎没有太多关于这个主题的内容 我找到了建议的解决方案 String unicodeString new String utf8 here byte bytes String getBytes UTF8 String
  • beforeRequest事件jqGrid:在调用url之前设置jqGrid页面

    我试图在对 URL 的 GET 请求之前设置 jqGrid 中的页面变量 jQuery frTable jqGrid cmTemplate sortable false caption TempData POPNAME Population
  • Rust OpenTelemetry OTLP 带 Honeycomb

    我正在尝试使用opentelemetry and open telemetry otlp通过 OTLP 向 Honeycomb 提供可观测性数据 我使用这样的东西作为概念证明 如果你想运行它 可以将其提取到此存储库中 https githu
  • 使列表不可变[重复]

    这个问题在这里已经有答案了 可能的重复 C 中的不可变列表 是否可以使列表不可变 您可以使用ReadOnlyCollection
  • 表单提交无需刷新页面

    有人可以告诉我使用教程吗jquery显示表单提交成功 无需刷新页面 当邮件发送时 gmail 上会发生类似的情况 黄色叠加层显示您的邮件已发送 然后淡出 我希望根据表单提交的结果显示消息 好的 类似这样的 但我没有尝试 所以像教程一样使用它
  • 为什么@EnableWs从spring bean中删除aop代理

    我正在尝试在我的 Spring Boot Web 服务项目中添加自定义拦截器 我跟随this示例并创建了此配置 package org example import java util List import org aspect Pers
  • 如何更改列的标识增量

    以下语句可以重置种子 DBCC CHECKIDENT 表名 RESEED 1 但这次我必须改变它的增量 或者您可以使用 Sql Server Management Studio 使用这种方法很可能会重新创建该表
  • Java中如何计算HashMap内存使用量?

    我在面试中被要求计算内存使用情况HashMap如果其中有 200 万个项目 预计会消耗多少内存 例如 Map