在JVM中,使用了OOP-KLASS模型来表示内存中的java对象。
InstanceKlass:
jvm在加载解析.class文件完成后,创建InstanceKlass对象,表示其元数据,包括类型信息,字段信息、方法信息,常量池等。InstanceKlass对象存放在方法区中,InstanceKlass是jvm中的数据结构,供jvm内部使用,HotSpot并不把InstanceKlass暴露给Java开发者,Java开发者使用的是java.lang.Class对象,JVM将java.lang.Class对象称为 _java_mirror,即Class对象是InstanceKlass对象的“Java镜像”。InstanceKlass对象持有对Class对象的引用(_java_mirror便是InstanceKlass持有的对Class对象的引用)
OOP
Ordinary Object Pointer,普通对象指针。
Klass是在.class文件在加载过程中创建的,OOP则是在Java程序运行过程中new对象时创建的。
一个OOP对象包含以下几个部分:
- instanceOopDesc(描述对象头的数据结构),包括:
1)Mark Word,主要存储对象运行时的记录信息,如hashcode, GC分代年龄,锁状态标志,线程ID,时间戳等;
2)元数据指针,即指向方法区的instanceKlass实例; - 实例数据
简单说,比如有个Person类,则Person类的实例——>Person的instanceKlass——>Person的Class。
从源码角度分析java.lang.Class对象 参考:
Class实例在堆中还是方法区中?