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模型入下所示