Java对象模型

转载:http://blog.****.net/linxdcn/article/details/72850375

1.【理解HotSpot虚拟机】对象在jvm中的表示:OOP-Klass模型

1 概述

HotSpot是基于c++实现,而c++是一门面向对象的语言,本身具备面向对象基本特征,所以Java中的对象表示,最简单的做法是为每个Java类生成一个c++类与之对应。

但HotSpot JVM并没有这么做,而是设计了一个OOP-Klass Model。这里的 OOP 指的是 Ordinary Object Pointer (普通对象指针),它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象。而 Klass 则包含元数据和方法信息,用来描述Java类。

之所以采用这个模型是因为HotSopt JVM的设计者不想让每个对象中都含有一个vtable(虚函数表),所以就把对象模型拆成klass和oop,其中oop中不含有任何虚函数,而Klass就含有虚函数表,可以进行method dispatch。

2 OOP-Klass模型

2.1 Klass

Klass简单的说是Java类在HotSpot中的c++对等体,用来描述Java类。

Klass主要有两个功能:

  • 实现语言层面的Java类
  • 实现Java对象的分发功能

那Klass是什么时候创建的呢?一般jvm在加载class文件时,会在方法区创建instanceKlass,表示其元数据,包括常量池、字段、方法等。

2.2 OOP

Klass是在class文件在加载过程中创建的,OOP则是在Java程序运行过程中new对象时创建的。

一个OOP对象包含以下几个部分:

  • instanceOopDesc,也叫对象头 
  • Mark Word,主要存储对象运行时记录信息,如hashcode, GC分代年龄,锁状态标志,线程ID,时间戳等
  • 元数据指针,即指向方法区的instanceKlass实例
  • 实例数据

3 实例说明

假如我们有如下代码:

class Model{ public static int a = 1; public int b; public Model(int b) { this.b = b; }}public static void main(String[] args) { int c = 10; Model modelA = new Model(2); Model modelB = new Model(3);}

 

上述代码得OOP-Klass模型入下所示

 

Java对象模型