我们知道函数在内存中是实现是栈。同时我们知道java方法实现是在JVM栈中的帧,对象就是被分配到堆上的。

那再堆中java对象到底是什么样的?一旦对象放入内存,它就只是一些字节数据了。

然后我们怎么找到我们需要的东西呢?它保存了一个内部的字段偏移量表。

这是一个类“Base”的结构,它内没有任何方法。下一节我们才讨论方法的结构。

 Base对象结构

如果我们有另外一个对象”Derived”继承于”Base”。那内存结构如下:

 Base对象结构

子类有和父类同样的内存结构,除此之外还需要新的空间存储新添加的字段。这样的结构哟个好处是,当A的指针指向D对象的时候,这样仍然和指向B是一样的。因此,通过操作B对象操作D是很安全的,而且也没有必要的动态监测B的指针了。

因为有相同的逻辑,方法可以仿制对象的开头。

 Base对象结构

然而这样的方法不是很有效。如果一个类有很多方法(如M),那么每个对象都必须有空间来存储M的指针,这样使得创建对象慢,对象大。

改进方式是创建一个虚函数表(或者vtable),这是一个数组,指向特殊类的,这样使得每穿件一个对象的指针都存储到虚函数表。

 优化对象内存存储

参考文档