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

翻译 2015年11月19日 18:00:46

我们知道函数在内存中作为一条栈的激活记录被实现,我们也知道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/

相关文章推荐

JVM运行时是什么样子?

Java是在JVM上运行的,那么JVM运行时是什么样子? 对于JVM运行时的数据区的理解用一个图来显示很形象,下面的图显示JVM运行时的数据区。 每个线程的数据区 从图中可以看出,每个线...

JVM运行时是什么样子?

Java是在JVM上运行的,那么JVM运行时是什么样子? 对于JVM运行时的数据区的理解用一个图来显示很形象,下面的图显示JVM运行时的数据区。 每个线程的数据区 从图中可以看出,每...

聊聊高并发(四)Java对象的表示模型和运行时内存表示

在继续了解Java内存模型之前,最好先理解Java对象的内存表示。在网上搜了下Java对象内存表示,说得都不够系统和到位。之前看了《Hotspot实战》一书,对JVM如何表示对象这块说得挺好,推荐一下...

聊聊高并发(四)Java对象的表示模型和运行时内存表示

在继续了解Java内存模型之前,最好先理解Java对象的内存表示。在网上搜了下Java对象内存表示,说得都不够系统和到位。之前看了《Hotspot实战》一书,对JVM如何表示对象这块说得挺好,推荐一下...

JAVA程序运行时 对象的放置安排及内存的分配

程序运行时,对象是怎样放置安排的呢?特别是内存是怎样分配的呢?对这些方面的了解会对你有很大的帮助。有五个不同的地方可以存储数据:        1.寄存器。这是最快的存储区,因为它位于不同于其他存储...

理解Java虚拟机(4)之JVM运行时内存分配管理和对象内存分布

理解Java虚拟机(4)之JVM运行时内存分配管理和对象内存分布读《深入理解Java虚拟机》-周志明 读书笔记classLoader将class文件加载进虚拟机后,就是要开始运行程序员写的代码了,要运...

C++程序运行时内存布局之----------this到底是什么?

先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面...

C++程序运行时内存布局之----------this到底是什么?

先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面...

C++程序运行时内存布局之----------this到底是什么?

先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面...

C++程序运行时内存布局之----------this到底是什么?

先问一个问题,在C++里,成员函数里的this指针和调用此函数的对象地址总是一样的吗?如果你的回答是:不一定。那么至少你是个老手吧,下面的内容你就不用看了;如果你的回答是:是啊,那么强烈建议你看看下面...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)