2017-02-27 82 views
0

我看到其中之一被描述爲「實例類是Java類的VM級表示。」另一個是「一個klassOop是一個Java類的C++等價物」,那麼它們之間的區別是什麼?爲什麼我們需要他們兩個,我們可以結合二對一嗎? http://hg.openjdk.java.net/jdk7u/jdk7u60/hotspot/file/ba66650acf63/src/share/vm/oops/instanceKlass.hpp http://hg.openjdk.java.net/jdk7u/jdk7u60/hotspot/file/ba66650acf63/src/share/vm/oops/klassOop.hppklassoop和instanceklass真的有什麼區別?

回答

1

這將是更準確的比較klassOopKlass,因爲instanceKlassKlass特定的後裔。

在JDK 7類中,元數據存儲在永久生成的Java堆中。像Java中的所有對象堆類元數據都有一個對象頭。 klassOop基本上是一個包裝器,將C++ Klass對象封裝到Java Heap對象(也稱爲OOP)中。

 _________________ 
    |     | 
    | mark_word  | <-- OOP header 
    | klass_field  | 
    | _______________ | 
    ||    || 
    || C++ vtbl ptr || <-- InstanceKlass data 
    || subtype cache || 
    || instance size || 
    || java mirror || 
    || super   || 
    || access_flags || 
    || name   || 
    || ...   || 
    ||_______________|| 
    |_________________| 

由於JDK 8沒有更多的永久代,並且沒有更多的klassOop實體。所有的類元數據都作爲普通的C++對象存儲在Metaspace中。

如果你想學習HotSpot JVM內部構件,我建議你考慮一下jdk8u版本庫。

+0

謝謝你apangin。 –