class Struct1 {
byte b1;
}
class Struct2 extends Struct1 {
byte b2;
}
class Struct3 extends Struct2 {
byte b3;
}
class Struct4 extends Struct3 {
byte b4;
}
class Struct5 extends Struct4 {
byte b5;
}
class Struct6 extends Struct5 {
byte b6;
}
class Struct7 extends Struct6 {
byte b7;
}
class Struct8 extends Struct7 {
byte b8;
}
class FlatStruct8 {
byte b1, b2, b3, b4, b5, b6, b7, b8;
}
On my JVM (1.6.0_16 64-bit):
sizeof (new Struct8()) = 80 (sic!)
sizeof (new FlatStruct8()) = 24
Now, 24 makes sense (8 bytes of data + 2 x 8 bytes of object overhead). In case of Struct8, we can see that Java pads fields declared in each class to so that total block size will be multiple of 8.
I used both Instrumentation-based and GC-based sizeof () implementations to confirm this.
On 32-bit JVM (1.6.0_04-b12) blocks are padded to multiple of 4.
sizeof (new Struct8()) = 40
sizeof (new FlatStruct8()) = 24
More about padding.