【问题标题】:Java memory usage in inheritance继承中的 Java 内存使用
【发布时间】:2014-11-11 12:23:40
【问题描述】:

扩展基类时,Java 中的内存使用情况如何。

子类是否包含基类的实例(有它自己的开销和所有)还是只有它自己的 16 字节开销?

class Foo {
 int x;
}

class Bar extends Foo {
 int y;
}

那么,更具体地说,Bar 实例的内存使用量是多少?

Foo (including overhead) + Bar(including overhead)

或者只是Foo (excluding overhead + Bar(including overhead)

【问题讨论】:

  • 只有一个标头,只有一个对象。 Bar 的字段紧跟在内存中 Foo 的字段之后。

标签: java inheritance memory subclass


【解决方案1】:

没有双重开销。

Java 将获取类和超类,计算所有字段所需的空间,并为单个实例分配所需的空间。

仅从内存的角度来看,根本不存在超类的概念,有 Foo 的实例只需要一个 int 的内存,而 Bar 的实例需要两个 int 的内存,其中一个是因为 Bar 恰好扩展了 Foo。

所以开销(或簿记或任何你想调用的)只发生一次。

但是,在使用 Java 进行开发时,通常最好不要过多地关心内存内容,除非您有非常具体(我的意思是非常非常非常具体)的用例,而在这些用例上,记账开销会给您带来严重的问题。在这种情况下,还应考虑 8 字​​节填充。

通常,除了不必担心每个实例的内存开销之外,还有许多其他方法可以改善应用程序的内存占用或整体性能。

【讨论】:

  • 可以说我只想使用类的一部分 - 使整个类的对象占用内存。如果该类改为分为超类部分和子类,这将允许我仅实例化我需要的部分 - 使我的应用程序的内存效率更高。对吗?
【解决方案2】:

每个对象只有一个类头,所以它只有后者。

顺便说一句,您可以使用https://sourceforge.net/projects/sizeof/https://code.google.com/p/memory-measurer/ 轻松检查这一点

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    相关资源
    最近更新 更多