JVM内存结构之三·堆中对象

2021-08-13

这些类都定义在包中: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.