这些类都定义在包中:jdk/src/hotspot/share/oops/
oop:ordinary object pointer
# 零、oopDesc基类
0.1 对象访问定位
如果对象访问定位采用 句柄,那么句柄中 指向实例数据的指针应指向 oopDesc实例的地址,指向对象实例类型的指针仍指向方法区。
如果对象访问定为采用 直接指针,那么这个指针就是 oopDesc实例的地址。所以这时oopDesc实例中应有指向方法区中java对象类型的指针。
hostSpot使用直接指针定位对象。
0.2 oopDesc定义
// jdk/src/hotspot/share/oops/oop.hpp
#include "oops/markWord.hpp"
class oopDesc {
friend class VMStructs;
friend class JVMCIVMStructs;
private:
volatile markWord _mark;
union _metadata {
Klass* _klass;
narrowKlass _compressed_klass;
} _metadata;
...
Klass指针指向该对象对应的类的指针,方法区中的这个类。
## markWord
#include "oops/markWord.hpp"
// The markWord des
cribes the header of an object.
对象头目的是用来描述该对象的一些基本信息,所以对象头应包含尽量多的信息且内存占用尽量小。
// 32 bits:
// --------
// hash:25 ------------>| age:4 unused_gap:1 lock:2 (normal object)
//
// 64 bits:
// --------
// unused:25 hash:31 -->| unused_gap:1 age:4 unused_gap:1 lock:2 (normal object)
# 一、普通对象
定义在文件:jdk/src/hotspot/share/oops/instanceOop.hpp
// An instanceOop is an instance of a Java Class
// Evaluating "new HashTable()" will create an instanceOop.
class instanceOopDesc : public oopDesc {
public:
// aligned header size.
static int header_size() { return sizeof(instanceOopDesc)/HeapWordSize; }
// If compressed, the offset of the fields of the instance may not be aligned.
static int base_offset_in_bytes() {
return (UseCompressedClassPointers) ?
klass_gap_offset_in_bytes() :
sizeof(instanceOopDesc);
}
};
# 二、数组对象
定义在文件:jdk/src/hotspot/share/oops/arrayOop.hpp
> class arrayOopDesc : public oopDesc {}
// The layout of array Oops is:
//
// markWord
// Klass* // 32 bits if compressed but declared 64 in LP64.
// length // shares klass memory or allocated after declared fields.