的其餘部分分開分配我的理解,這樣做Derived d = new Derived();
至少會保證a
和b
連續地分配。但是,是否有可能將子對象Base
與內存中的其餘c
,Derived
分開,還是必須連續分配整個對象。能子對象從鑑於這種故意非常簡單的對類</p> <pre><code>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; } </code></pre> <p>派生類
另外,我是否正確假設Base
中的兩個int
s是連續的?
即使連續分配,Base
子對象在離開Eden空間時能否與Derived
的其餘部分分離?
它不需要連續分配 - 只要觀察到語義,JVM就可以自由分配它,只要觀察到語義 - 但大多數JVM都會在所需的填充之後進行分配。沒有辦法(通過Java語言)來控制這種行爲。 –
不保證對象中的字段(例如'a'和'b')被連續分配。例如,JVM可以有一些從超類繼承的填充,並可以選擇使用其中一個字段來填充該填充。或者,JVM可能會剖析你的對象,並確定''a'很少被使用,而'b'很熱,並且可以選擇將'a'放置在遠離對象的某處。這些都是假設的--JVM規範沒有說明如何在內存中佈置對象。 – pburka
(我在一個JVM上工作的字段是「打包」的,有一個較短的字段(如果有的話)佔用頭中的空白空間,並重新排列其他字段,以便發生適當的類型對齊, 。派生類的char字段,例如最終可能隱藏在基類的兩個字段之間。) –