【问题标题】:How can I calculate how much RAM an object uses?如何计算一个对象使用了多少 RAM?
【发布时间】:2011-03-17 14:34:50
【问题描述】:

我有一个包含 1200 万个条目的 HashMap。它将String 值映射到Long 值。每个字符串大约有十个字符长。是否可以计算出这张地图在 RAM 中需要多少内存?

【问题讨论】:

  • 您是否需要一个准确的答案,或者您是否正在寻找一个非常近似的答案,以决定是否使用基于磁盘的方法进行此查找?
  • 你可以先尝试少加一点,比如 100 万,他们利用 jmap -histo (位于你的 JDK bin 目录中)给你 HashMap 的内存使用情况,字符串和长。

标签: java memory map size hashmap


【解决方案1】:

您可以猜测,并且可以通过查看进入地图的每个项目的大小来做出有根据的猜测,但您最好的有根据的猜测会是错误的。

JVM 具有用于跟踪引用和保存类的类型信息的其他结构。这将为准确的(如果您能提出准确的输入估计)估计增加固定但未知的内存量。

由于只有部分内存是直接保存数据的内存,而部分内存是用作保存数据的开销的内存,因此您需要分析内存消耗并根据内存“增长”的预测进行估算使用较小的地图时。

请注意,对 JVM 进行分析是一项棘手的任务,因为它正在以一种会根据 JVM 运行时间、Map 的活动等情况呈现不同结果的方式优化内存使用。您需要进行统计抽样各种条件下的输入;但是,很有可能您最终能够找到一个合理的数字。更重要的是,您还可以说“它可能会暂时在这个数字附近达到顶峰,但平均而言应该稳定下来”。在静态分析中经常会忽略内存的时间变化。

【讨论】:

    【解决方案2】:

    JVM 会知道,因为它必须分配和管理内存,但它不会告诉你。所以,如果不是原生的,不,没有办法知道你的对象实际使用了多少内存。

    【讨论】:

      【解决方案3】:

      分析器会告诉您程序正在使用多少内存,以及哪些对象正在使用什么。您也许能够找到对象的内存使用情况。

      VisualVM 包含在 Java6 中,会为您提供这些信息。

      值得一提的是,这并不一定会给你一个内存“需求”,只是一个关于它在那个时间点使用多少内存的视图。

      【讨论】:

        猜你喜欢
        • 2014-07-05
        • 1970-01-01
        • 2020-07-28
        • 2010-09-18
        • 2011-11-18
        • 1970-01-01
        • 2021-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多