2015-03-19 206 views
1

如何是有可能,Java對象的最小大小爲8個字節(僅目標首標),Java對象的大小

What is the memory consumption of an object in Java?

如果在表示Java對象的C++類,

http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/oops/oop.hpp

我可以看到的是,類有多個成員

class oopDesc { 
    friend class VMStructs; 
private: 
    volatile markOop _mark; // this is the object header 
    union _metadata { 
    wideKlassOop _klass; 
    narrowOop  _compressed_klass; 
    } _metadata; // what about size of this member? 
+1

爲什麼您認爲C++代表擁有更多成員?只有兩個:_mark和_metadata,它們中的每一個在32位體系結構上都是4個字節。 _metadata是一個聯合,即_klass和_compressed_klass共享相同的空間。 – apangin 2015-03-19 11:37:48

+0

apangin:是的你是對的,我的錯,我刪除的那個成員是靜態成員,markOop有4個字節 – Krab 2015-03-19 11:39:58

回答

1

這是可能的,因爲在32位JVM對象包含4個字節的標記頭和4個字節的類引用。標記標頭包含根據對象類型(位尺寸)不同的信息:

正常對象 - >未使用:25哈希:31 cms_free:1年齡:4 biased_lock:1鎖:2

偏置對象 - > JavaThread *:54 epoch:2 cms_free:1 age:4 biased_lock:1 lock:2

0

由於標題數據是二進制編碼的。當通過JVMTI或本地調用訪問這些信息時,這個二進制數據被分解爲更廣泛的數據類型。

此外,這些大小是實現細節,取決於VM的位數和虛擬機使用所謂的compressed oops的事實。您可以使用OpenJDK中分發的JOL tool讀出實例的實際標題。此外,您可以在源代碼中找到documentation of encoding of the header