我看到其中一个被描述为“一个 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
比较klassOopvs.会更准确Klass,因为它instanceKlass是Klass.
在 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存储库。
| 归档时间: |
|
| 查看次数: |
856 次 |
| 最近记录: |