0%

oop-klass二分模型

文章字数:308,阅读全文大约需要1分钟

HotSpot JVMjava的对象是用OOP-Klass模型来对应的。

OOP

Ordinary Object Pointer 普通对象指针,主要职能是标识对象的实例数据(存储在堆里)。
根据JVM内部使用的对象业务类型,具有多种oopDesc子类,比如instanceOopDesc表示类的实例,arrayOopDesc表示数组。
包含:

  1. Mark Word主要存储对象运行时记录信息,如hashcodeGC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等;
  2. 元数据指针,_metadata成员,可以表示未压缩和压缩的Klass指针,指向Klass对象(存储元数据的类)
1
2
3
4
5
6
7
8
9
10
class oopDesc {
//....
private:
volatile markOop _mark;
union _metadata {
Klass* _klass;
narrowKlass _compressed_klass;
} _metadata;
//....
}

Klass

包含元数据方法信息,用来描述java类(存储在方法区)
每个已加载的java类都会创建一个instanceKlass对象,用来标识java内部类型的机制。
包含:

  1. ClassState: 描述了类加载的状态:分配、加载、连接、初始化
  2. instanceKlass: 声明接口、字段、方法数组、常量池、源文件名等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class instanceKlass: public Klass {
friend class VMStructs;
public:

enum ClassState {
unparsable_by_gc = 0, // object is not yet parsable by gc. Value of _init_state at object allocation.
allocated, // allocated (but not yet linked)
loaded, // loaded and inserted in class hierarchy (but not linked yet)
linked, // successfully linked/verified (but not initialized yet)
being_initialized, // currently running class initializer
fully_initialized, // initialized (successfull final state)
initialization_error // error happened during initialization
};

//部分内容省略
protected:
// Method array. 方法数组
objArrayOop _methods;
// Interface (klassOops) this class declares locally to implement.
objArrayOop _local_interfaces; //该类声明要实现的接口.
// Instance and static variable information
typeArrayOop _fields;
// Constant pool for this class.
constantPoolOop _constants; //常量池
// Class loader used to load this class, NULL if VM loader used.
oop _class_loader; //类加载器
typeArrayOop _inner_classes; //内部类
Symbol* _source_file_name; //源文件名
}