2011-08-02 8 views
12

當我有這樣一個類:類實例中的方法是否在內存中佔據一席之地?

class Test { 
    private int _id = 0 ; // 4 bytes 
    private int _age = 0 ; // 4 bytes 
} 

我敢肯定,它的每個實例都將在內存消耗,因爲2個整數超過8個字節。

但是方法呢?如果我有一個擁有一百萬個方法的類,並且有兩個實例,那麼這些方法會在內存中佔據兩倍的位置?

它是如何工作的?

謝謝。

回答

19

編號方法在內存中只出現一次。它們不是每個實例基於變化,所以它們不需要基於每個實例的存儲

Java中的一個對象基本上由一些固定大小的「內務」(指向類型信息的指針,包括vtable),潛在的GC相關位(想法標記和掃描),關於實例監視器的信息等 - 然後是田地。


這是有點簡化。可能有各種表示形式,例如字節碼,本地代碼等 - 但不管單獨的實例如何。

+0

Jon Skeet - 唯一一個能夠在45秒內得到兩個upvotes的人。 –

7

具有相同類的兩個實例不會重複方法代碼所需的空間量。也就是說,這些方法駐留在內存中的一個位置,然後每個類的實例都有一個指向內存中該位置的指針。這是因爲否則內存將被浪費。每個方法需要執行的代碼都是相同的,無論類的哪個實例調用它,所以複製它是沒有意義的。

3

但是爲了執行像instance.method()這樣的方法,該方法的本地副本將在每個實例的堆棧中進行,其中實例將位於堆中。

相關問題