运行时java对象在内存中是什么样子的?

我们知道函数在内存中作为一条栈的激活记录被实现,我们也知道java方法作为栈的一片被实现,java对象在堆中被分配。

java对象在堆中是什么样的呢,一旦一个对象被放入内存中,那么它就是一连串的byte。那么我们怎么去找特定的区域呢,在编译器内存保存一个内部表包含每一个区域的位移量。下边是一个类“Base”对象的例子,这个类没有任何方法,方法在内存中是如何铺放的,我们下一节会讲到。


如果我们有另一个类Derived,继承自Base类,内存中的样子如下:


子对象有和父对象相同的内存分布,另外它需要额外的空间安放新增加的字段。这种分布的好处是,在开始的时候类B的指针A指向D对象依旧可以看到B对象的内容。因此,通过B的引用在D上的操作是安全的,没有必要检查B动态的指向什么。这就解释了多态的实现的原理


但是这种方法没有效率,如果一个类有很多的方法,那么每一个对象必须有相应的指针集合,另外每一个对象需要为这些指针分配空间,这样对象的创建变的很慢并且导致对象很大。优化的方法是创建一个虚拟的函数表,包含了为特定的类的函数分配的指针的数组。


原文链接:http://www.programcreek.com/2011/11/what-do-java-objects-look-like-in-memory/

阅读更多
文章标签: 内存 java
个人分类: 垃圾回收
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭