1

鉴于这对故意非常简单的类

class Base {
    private int a;
    private int b;
    public Base() {
        this.a = 0; 
        this.b = 0
    }
}

class Derived extends Base {
    private int c;
    Derived() {
        super();
        this.c = 0;
}

我的理解是,做Derived d = new Derived();至少可以保证这一点a并且b是连续分配的。但是,子对象是否可以与内存中Base的剩余对象分开,或者整个对象是否必须连续分配。cDerived

另外,我的假设是否正确,两个ints inBase是连续的?

即使它是连续分配的,子对象是否可以在离开伊甸园空间时Base与其他对象分开?Derived

4

1 回答 1

2

我的理解是做 Derived d = new Derived(); 至少会保证 a 和 b 是连续分配的。

这是不正确的。JVM 规范没有做出这样的保证,而且我熟悉至少一个主要的 JVM 实现,其中它是错误的。

另外,我的假设是否正确,即 Base 中的两个整数是连续的?

没有。同样,规范没有说明对象在内存中的布局方式。

即使它是连续分配的,在离开 Eden 空间时,Base 子对象是否可以与 Derived 的其余部分分开?

是的,它可以。但是由于对象布局没有在 Java 或 JNI 中公开,这与大多数 Java 程序员无关。

于 2013-10-06T02:45:07.830 回答