2013-10-06 62 views
1

的其餘部分分開分配我的理解,這樣做Derived d = new Derived();至少會保證ab連續地分配。但是,是否有可能將子對象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的其餘部分分離?

+2

它不需要連續分配 - 只要觀察到語義,JVM就可以自由分配它,只要觀察到語義 - 但大多數JVM都會在所需的填充之後進行分配。沒有辦法(通過Java語言)來控制這種行爲。 –

+0

不保證對象中的字段(例如'a'和'b')被連續分配。例如,JVM可以有一些從超類繼承的填充,並可以選擇使用其中一個字段來填充該填充。或者,JVM可能會剖析你的對象,並確定''a'很少被使用,而'b'很熱,並且可以選擇將'a'放置在遠離對象的某處。這些都是假設的--JVM規範沒有說明如何在內存中佈置對象。 – pburka

+0

(我在一個JVM上工作的字段是「打包」的,有一個較短的字段(如果有的話)佔用頭中的空白空間,並重新排列其他字段,以便發生適當的類型對齊, 。派生類的char字段,例如最終可能隱藏在基類的兩個字段之間。) –

回答

1

這是我的印象派做Derived d = new Derived();至少會保證a和b是連續分配的。

這是不正確的。 JVM規範沒有提供這樣的保證,我熟悉至少有一個主要的JVM實現,它是錯誤的。

另外,我是否正確假設Base中的兩個整數是連續的?

不需要。再說一遍,規範並沒有說明如何在內存中佈置對象。

即使連續分配,在離開Eden空間時,Base子對象可以與Derived的其餘部分分離嗎?

是的,它可以。但是由於對象佈局未在Java或JNI中公開,因此這與大多數Java程序員無關。

相關問題