klassoop和instanceklass之间的真正区别是什么?

时间:2017-02-27 03:10:42

标签: jvm

我看到其中一个被描述为“一个instanceKlass是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.hpp

1 个答案:

答案 0 :(得分:3)

比较klassOopKlass会更准确,因为instanceKlassKlass的特定后代。

在JDK 7中,类元数据存储在Permanent Generation of Java Heap中。与Java中的所有对象一样,Heap类元数据具有对象标头。 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存储库。