gpt4 book ai didi

java - Java继承的大小成本是多少?

转载 作者:IT老高 更新时间:2023-10-28 20:30:32 26 4
gpt4 key购买 nike

互联网上有各种文章试图凭经验估计 java.lang.Object 在特定 JVM 实现中的开销。例如,我看到了一个裸 Object estimated at 8 bytes 的大小开销。在一些 JVM 中。

我想知道的是,extends 关系的典型 JVM 实现是否会在类层次结构的每个级别引入增量大小开销。换句话说,假设您有一个包含 N 级子类的类层次结构。类实例在内存中表示的开销是 O(1) 还是 O(N)?

我想它是 O(1),因为虽然你需要成为 Java Object(vtable,类链)的一些隐藏的蓬松东西的大小会随着继承层次结构的增长而增长,它们按类增长,而不是按实例增长,并且 JVM 实现可以将指向这些实体的恒定大小指针存储在附加到每个 Object 的恒定大小 header 中。

所以理论上,对于继承深度 N,直接附加到任何 Java 对象的内存表示的开销应该是 O(1)。有谁知道这在实践中是否正确?

最佳答案

如有疑问,请查看 source (嗯,a 来源;每个 JVM 都可以自由选择如何去做,因为标准不要求任何内部表示)。所以我看了一下,发现following comment在JDK 7-u60的热点JVM实现中:

// A Klass is the part of the klassOop that provides:
// 1: language level class object (method dictionary etc.)
// 2: provide vm dispatch behavior for the object
// Both functions are combined into one C++ class. The toplevel class "Klass"
// implements purpose 1 whereas all subclasses provide extra virtual functions
// for purpose 2.

// One reason for the oop/klass dichotomy in the implementation is
// that we don't want a C++ vtbl pointer in every object. Thus,
// normal oops don't have any virtual functions. Instead, they
// forward all "virtual" functions to their klass, which does have
// a vtbl and does the C++ dispatch depending on the object's

按照我的阅读方式,这意味着对于这个(非常流行的)实现,对象实例只存储指向它们的类的指针。 具有更长或更短继承链的类的每个实例的成本实际上是 0。虽然类本身确实占用了内存空间(但每个类只有一次)。深度继承链的运行时效率是另一回事。

关于java - Java继承的大小成本是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23948009/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com