1、 base_create是klass_oop的成员函数
2、 klass_vtble定义了allocate_pernament的虚函数以及宏
a. 每个子类都有各自的allocate_pernament函数。由于虚函数表,也有其父类的函数接口
b. Base_create通过vtable调用子类的alloc进行分配,最后分配一个句柄
3、 所有子类通过调用宏,来完成allocate_pernament的实现
4、 New是继承的父类的,继承的klass_vtbl的
为了初始化一个实例的C++vtable,元数据强制使用C++内置的new操作。典型的基于C++的系统,每个子类都有自己的new规范方法,直接调用想要类的构造方法,然后调用合适的构造链
但是hotspot对于子类来说,共用相同的分配和初始化方法,这不像C++层次明显。共享方法不能清晰知道需要创建的子类
因此,create调用者必须将特定的new方法包装在虚方法中,该虚方法即为alloc_permanent。
该虚方法被一个临时的已被实例化的子类调用,真正的对象被创建在heap上
工厂必须知道如何初始化子类,所以有exampleinstances的概念
每一个工厂对象不仅仅是虚方法表的容器,C++不允许直接引用vtables,所以工厂对象必须代理给一个分配的实例。最重要的一点,工厂必须知道如何用适合的初始化指针初始化C++vtables。其他共用的初始化工作就交给了base_create
Klass的作用
1、 语言层面上的object对象
2、 实现分发机制
如此做的理由是,oops中将不含有虚方法函数,而虚方法全部指向了对应的klass。Klass真实的去做对应和分发
Klass是C++层面的结构体,oop是klass去掉了头部,handle是一个句柄,*handle中存放的是oop的地址