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

YuF*_*hen 1 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

apa*_*gin 5

比较klassOopvs.会更准确Klass,因为它instanceKlassKlass.

在 JDK 7 中,类元数据存储在 Java 堆的永久代中。就像 Java Heap 类元数据中的所有对象一样,都有一个对象头。klassOop基本上是一个包装器,将 C++Klass对象包装成 Java 堆对象(也称为 OOP)。

     _________________
    |                 |
    | mark_word       |  <-- OOP header
    | klass_field     |
    | _______________ |
    ||               ||
    || C++ vtbl ptr  ||  <-- InstanceKlass data
    || subtype cache ||
    || instance size ||
    || java mirror   ||
    || super         ||
    || access_flags  ||
    || name          ||
    || ...           ||
    ||_______________||
    |_________________|
Run Code Online (Sandbox Code Playgroud)

从 JDK 8 开始,不再有永久代,也不再有klassOop实体。所有类元数据都作为普通 C++ 对象存储在 Metaspace 中。

如果您想研究 HotSpot JVM 内部结构,我建议改为查看jdk8u存储库。