扩展基类时,Java中的内存使用情况如何?
子类是否包含基类的实例(它有自己的开销和全部),还是只包含16 Bytes的开销?
class Foo {
int x;
}
class Bar extends Foo {
int y;
}那么,更具体地说,Bar实例的内存使用情况如何呢?
是Foo (including overhead) + Bar(including overhead)吗?
或者仅仅是Foo (excluding overhead + Bar(including overhead)
发布于 2014-09-17 12:55:17
没有双倍的开销。
Java将接受类、超类、计算所有字段所需的空间以及为单个实例分配所需的空间。
从内存的角度来看,根本不存在超类的概念,Foo的实例只需要一个int,而Bar的实例需要两个int的内存,其中一个是因为Bar碰巧扩展了Foo。
因此,开销(或簿记或任何您想调用的东西)只发生一次。
但是,在用java进行开发时,通常最好不要过多地关心内存内容,除非您有非常具体(我指的是非常具体的)用例,而在这些用例上,图书隐藏开销会给您带来严重的问题。在这种情况下,也应该考虑8字节填充。
通常,除了不担心每个实例的内存开销之外,还有许多其他方法可以改善应用程序的内存占用或它的总体性能。
发布于 2014-09-17 12:54:13
每个对象只有一个类头,所以只有后者。
顺便说一句,您可以使用https://sourceforge.net/projects/sizeof/或https://code.google.com/p/memory-measurer/轻松地检查这一点。
https://stackoverflow.com/questions/25891022
复制相似问题