【问题标题】:Java memory guidelineJava 内存指南
【发布时间】:2010-01-11 21:33:20
【问题描述】:

可能是一个愚蠢的问题,但是..

对于基本 Java 数据结构将消耗多少内存有什么好的指导吗?

即:具有 int 成员和 String 成员的简单 POJO 将消耗多少内存(比如包含 10 个字符的字符串)? 10 个上述对象中的 List 会消耗多少内存?

【问题讨论】:

  • 在 SO 上有一些愚蠢的问题,但你的不是其中之一。 :-)

标签: java memory jvm memory-management


【解决方案1】:
【解决方案2】:

字符串是出了名的棘手,因为它们保存在一个字符数组下面,该数组与其他 String 对象共享,这些对象是原始 String 对象的子字符串。

【讨论】:

    【解决方案3】:

    我会说 144 位用于字符串(32 位用于指针,80 位用于 10 个字符,32 位用于长度 int),32 位用于 int,32 位用于指向对象的指针,即 208 位。 10 个列表需要 2080 位用于对象和指向它们的指针,另外 32 * 2 * 10 用于下一个和前一个指针,32 用于列表长度,32 用于指针。这使得总共 2784 位。根据我对 Java 的经验与我认为它需要的(又名 C)的比较,您应用乘以 2 的乘数,使其变为 5568 位。

    最后,如果您担心内存需求,请测试一下!但要测试这么少的数字是相当困难的……试试几千个吧。

    【讨论】:

    • 在 64 位 VM 上,指针可以是 64 位 - 10 个字符是 160 位,因为 Java char 是 16 位类型(与 C 相比,这可能说明您的经验)。
    • 两者都好 :) 我在 Java 中使用的主要领域是数据结构,它使用 Integer 而不是 int,我猜这就是案例中 x2 的来源。
    • Michael:然而,VM 规范并没有强制要求字符串在内存中保持 UTF16 编码。为了优化内存占用而不是运行时效率,String 实现也可以在内部保持字符数据 UTF8 编码或使用任何其他编码。
    • API 文档确实说“字符串表示 UTF-16 格式的字符串”。虽然在内部使用 UTF-8 时可能会满足 API,但对运行时效率的影响会非常可怕(很多 O(1) 方法突然变成 O(n))。
    【解决方案4】:

    IBM Research 的Gary Sevitsky 撰写了多篇关于分析和控制 Java 程序中的内存膨胀的论文。 his publication list 最近的一半似乎与您的询问相关。

    我参加了a tutorial of his at OOPSLA 2008 关于这个主题的讨论,发现它很好地介绍了 Java 中这个令人恐惧的、大部分被回避的方面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-07
      • 2011-01-31
      • 2011-04-23
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2011-01-13
      相关资源
      最近更新 更多