学习JVM的话,oop-class模型永远是一个绕不过去话题。我们都知道HotSpot VM几乎可以说是纯C++语言编写的Java虚拟机,那么Java的对象模型和C++的对象模型之间究竟有什么关系呢?这个问题简单回答就是oop-class二分对象模型。
究竟什么是oop-class模型呢?
事实上HotSpot底层究竟怎么表示一个Java对象这个问题归根结底就是C++怎么表述一个Java对象。有一个朴素的实现方案就是将每一个Java对象都影射为一个对等的C++对象,然而这么做确实是太朴素了,它有一个严重的弊端就是如果这样做的话那么就不得不为每一个Java对象都保存一份VTable(虚函数表),因为C++的多态实现就是为每一个对象都保留一份VTable。这是很浪费空间的,所以HotSpot设计者采用了oop-class二分模型来表述一个Java对象。其中这里的oop表示Ordianry Object Pointer(普通对象指针,注意可不是object-oriented programming),它用来表示对象的实例信息,看起来像个指针实际上是藏在指针里的对象。而 klass
则包含 元数据和方法信息,用来描述 Java 类。