【问题标题】:Java object creation and memory sizeJava 对象创建和内存大小
【发布时间】:2011-01-04 23:23:48
【问题描述】:

我正在尝试了解使用 new 运算符创建 Java 对象时分配的大小。

假设我正在创建一个类

public class NewClass {

    NewClass() { }

}

当我使用NewClass nc = new NewClass(); 创建NewClass 的实例时。在堆中创建的NewClass 的大小是多少?

~杰根

【问题讨论】:

    标签: java memory allocation


    【解决方案1】:

    分析是最好的方法,但您可以像这样得到一个很好的估计:

    每个对象 8 个字节(无开销),外加字段。

    • 原始字段:如 Java 中所列。注意:布尔值需要 1 个完整字节。
    • 对象字段:1 个指针(在 32 位 VM 上为 4 个字节,在 64 位上为 8 个字节),加上对象本身的大小(如果不是对预先存在的对象的引用)
    • 数组:4 个字节 + 元素的对象/基元
    • 字符串:太多了。 IIRC,24 字节 + 2 字节/字符。可能更多。

    最终结果增加到最接近的 8 个字节的倍数。

    另请参阅我的示例here,了解如何计算更复杂对象的内存使用情况。注意:这些规则可能因虚拟机而异,并且可能会随着新版本的虚拟机的出现而改变。我的估计只适用于 Sun JVM,尽管我怀疑 IBM 的结果会相似。

    【讨论】:

    • 请注意,如果您引用已经存在的对象,则“对象本身的大小”可能不适用。数组元素也是如此。
    • 我认为这是假设的,但足够公平 - 我添加了几个限定符以明确此估计适用于什么条件。
    • 我会说裸露的开销是 16 个字节。 (至少在 64 位 JVM 上)
    • @Peter:我认为你是对的(我在一个地方读到它是 2 个机器词),但你能引用一个来源来证实这一点吗?
    • 注意你两次命中的数组数组,例如double[3][2] 是 64 字节,而 double[6] 只有 52 字节。支持多维数组的语言,例如C#,没有这个问题。
    【解决方案2】:

    我认为您需要使用分析器来衡量这一点。为此,您可以使用 JProfilerYourKit 分析器。

    【讨论】:

      猜你喜欢
      • 2012-11-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-08-06
      相关资源
      最近更新 更多