我看到其中一个被描述为“一个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
答案 0 :(得分:3)
比较klassOop
与Klass
会更准确,因为instanceKlass
是Klass
的特定后代。
在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
存储库。